!
!***********************************************************************
!*
!* EMAS 2900 INTERFACE FOR KENT BASIC
!*
!**********************************************************************
!
!***********************************************************************
!*
!* EXTERNALS
!*
!***********************************************************************
!
%EXTERNALSTRING(16) INPUTFILE,OUTPUTFILE
!
!
!**********************************************************************
!*
!* CONSTANTS
!*
!**********************************************************************
!
%CONSTINTEGER NO = 0, %C
YES = 1
%CONSTINTEGER NIL = 0
!?1; %CONSTINTEGER JS VAR LIMIT = 7 ;! SET TO 7 FOR TEST PURPOSES %C
%CONSTINTEGER JS VAR LIMIT = 30
%CONSTINTEGER FILE LIMIT = 20
%CONSTINTEGER FOREGROUND = 1
%CONSTBYTEINTEGERARRAY CONTINGENCY MAP (0:79) = %C
1,2,3,4,5,6,7,8,9,10,11,12,13,14,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,64,51,66,
0,0,0,0,0,0,0,0,0,0,0,0,0
%CONSTSTRING(1)%ARRAY HEX TAB(0:15)="0","1","2","3","4","5","6","7", %C
"8","9","A","B","C","D","E","F"
!
!
!
!**********************************************************************
!*
!* GLOBALS
!*
!**********************************************************************
!
%RECORDFORMAT JS VAR RF (%STRING(8) NAME,%STRING(80) VALUE, %C
%INTEGER MAX LEN)
!?2; %OWNINTEGER TRACE COUNT
%OWNRECORDARRAY JS VAR (0:29) (JS VAR RF)
%RECORDFORMAT FHDR FORMAT %C
(%INTEGER DATA END,DATA START,FILE SIZE,FILE TYPE, %C
CHECK SUM,DANDT,FORMAT,RECORD COUNT)
%RECORDFORMAT FCR FORMAT %C
(%INTEGER EP,PC,LNB, %C
ROUTE,RAF SWITCH,CON ADDR,DATA FORMAT, %C
%RECORDNAME FHDR, %C
%INTEGER DATA LIMIT,RMIN,RMAX,CUR PTR,CUR LEN, %C
BUFF DR0,BUFF DR1,XFER DR0,XFER DR1,KEY DR0,KEY DR1, %C
POSITION,DISPLCMNT,ALL ACTIONS,NEW ACTIONS, %C
ACC ACTIONS,CURR DR0,CURR DR1, %C
%STRING(32) NAME,%STRING(6) OWNER)
%RECORDSPEC FCR FORMAT_FHDR (FHDR FORMAT)
%OWNRECORDARRAY FCT (0:20) (FCR FORMAT);! FILE CONTROL TABLE BEING A
! TABLE OF FILE CONTROL RECORDS
%OWNINTEGER ENTRY LNB
%OWNINTEGER EXEC MODE
%OWNINTEGER JS VAR COUNT
%OWNLONGREAL INITIAL CPU TIME
!?2; %OWNINTEGER TRACE STREAM
%OWNINTEGER LOG STREAM
!?3; %OWNINTEGER DIAG STREAM
%OWNINTEGER IT PROMPT FLAG
!
%OWNINTEGER INT DATA FLAG
%OWNINTEGERARRAY INT DATA (0:17)
%OWNLONGINTEGERARRAY CONT RTN DESC (0:63)
%OWNSTRING(6) USER NAME
!
!**********************************************************************
!*
!* EXTERNAL REFERENCES - SUBSYSTEM
!*
!**********************************************************************
!
!?1; %EXTERNALINTEGERFNSPEC RETURN CODE
%EXTERNALINTEGERFNSPEC OUT STREAM
%EXTERNALROUTINESPEC DEFINE (%STRING(255) PARMS)
%EXTERNALROUTINESPEC PROMPT(%STRING(15) NEW PROMPT)
%EXTERNALLONGREALFNSPEC CPU TIME
%EXTERNALSTRINGFNSPEC DATE
%EXTERNALSTRINGFNSPEC TIME
%SYSTEMROUTINESPEC DESTROY (%STRING(31) FILE NAME, %C
%INTEGERNAME FLAG)
%SYSTEMSTRINGFNSPEC CONFILE (%INTEGER ADDRESS)
%SYSTEMROUTINESPEC CHANGE ACCESS (%STRING(31) FILE NAME, %C
%INTEGER NEW ACCESS, %C
%INTEGERNAME FLAG)
%SYSTEMROUTINESPEC CHANGE FILE SIZE (%STRING(31) FILENAME, %C
%INTEGER NEW SIZE, %C
%INTEGERNAME FLAG)
%SYSTEMROUTINESPEC OUTFILE (%STRING(31) FILE NAME, %C
%INTEGER SIZE,GAP,PROTECTION, %C
%INTEGERNAME CONNECTED ADDR,FLAG)
%SYSTEMSTRINGFNSPEC NEXT TEMP
%SYSTEMROUTINESPEC MOVE (%INTEGER LENGTH,FROM ADDR,TO ADDR)
%SYSTEMROUTINESPEC ITOE (%INTEGER ADDRESS,LENGTH)
%SYSTEMROUTINESPEC ETOI (%INTEGER ADDRESS,LENGTH)
%SYSTEMROUTINESPEC FILL (%INTEGER LENGTH,ADDRESS,FILLER)
%EXTERNALROUTINESPEC SET RETURN CODE (%INTEGER RES)
%EXTERNALINTEGERFNSPEC UINFI (%INTEGER ENTRY)
%EXTERNALSTRINGFNSPEC UINFS (%INTEGER ENTRY)
!
!**********************************************************************
!*
!* EXTERNAL REFERENCES - DIRECTOR
!*
!**********************************************************************
!
%EXTERNALROUTINESPEC DRESUME (%INTEGER LNB,PC,ADDRESS)
%EXTERNALINTEGERFNSPEC PRIME CONTINGENCY (%ROUTINE ONTRAP)
%EXTERNALROUTINESPEC DRESET CONTINGENCY
%EXTERNALINTEGERFNSPEC READ ID (%INTEGER ADDRESS)
%EXTERNALINTEGERFNSPEC DISC ID
!%EXTERNALINTEGERFNSPEC DCONNECT (%STRING(6) USER, %C
! %STRING(15) FILE,%INTEGER FSYS,MODE,APF, %C
! %INTEGERNAME SEG,GAP)
!%EXTERNALINTEGERFNSPEC DDISCONNECT (%STRING(6) USER, %C
! %STRING(15) FILE,%INTEGER FSYS,DSTRY)
! DDISCONNECT PARAMETER DSTRY-- 0 FILE NOT DESTROYED -- 1 FILE DESTROYED
!
!**********************************************************************
!*
!* MISCELLANEOUS DECLARATIONS
!*
!**********************************************************************
%EXTERNALROUTINESPEC KBASC(%INTEGER DR0,DR1)
!?3; %EXTERNALROUTINESPEC XDUMP (%STRING(120) COMMENT,%INTEGER A,L)
!%EXTERNALINTEGERFNSPEC OMF LOAD (%STRING(63) FILE NAME)
!%EXTERNALROUTINESPEC FIND OMF ENTRY(%STRING(32) NAME, %C
! %INTEGERNAME DR0,DR1)
%INTEGERFNSPEC LOG MESSAGE (%INTEGER NIL0,NIL1,DR0,DR1)
%ROUTINESPEC ABANDON(%INTEGER I,%STRING(120) COMMENT)
!
!
!**********************************************************************
!*
!* SERVICE ROUTINES
!*
!**********************************************************************
!
%INTEGERFN I2(%INTEGER AD)
!AD POINTS TO THE FIRST OF A PAIR OF DECIMAL CHARACTERS. THE RESULT
!IS THE NUMERIC VALUE OF THE CHAS
%RESULT = 10*(BYTEINTEGER(AD)&X'F')+(BYTEINTEGER(AD+1)&X'F')
%END; !OF I2
%INTEGERFN PACKDATE(%STRING (8) DATE)
%INTEGER AD
AD = ADDR(DATE)
%RESULT = ((I2(AD+7)-70)<<26)!(I2(AD+4)<<22)!(I2(AD+1)<<17)
%END; !OF PACKDATE
%INTEGERFN PACKDATEANDTIME(%STRING (8) DATE, TIME)
%INTEGER AT
AT = ADDR(TIME)
%RESULT = PACKDATE(DATE)!(I2(AT+1)<<12)!(I2(AT+4)<<6)!(I2( %C
AT+7))
%END; !OF PACKDATEANDTIME
!
!
%INTEGERFN CREATE JS VAR (%STRING(8) NAME,%STRING(80) VALUE, %C
%INTEGER MAX LEN)
JS VAR COUNT = JS VAR COUNT + 1
%IF JS VAR COUNT = JS VAR LIMIT %THEN %RESULT = X'B01'
JS VAR(JS VAR COUNT)_NAME = NAME
JS VAR(JS VAR COUNT)_VALUE = VALUE
%IF MAX LEN < 0 %THEN JS VAR(JS VAR COUNT)_MAX LEN = LENGTH(VALUE) %C
%ELSE JS VAR(JS VAR COUNT)_MAX LEN = MAX LEN
%RESULT = -2
%END ;! OF CREATE JS VAR
!
!?1; %STRING(255)%FN ISOF(%STRING(255) ESTRING)
!?1; ETOI(ADDR(ESTRING)+1,LENGTH(ESTRING))
!?1; %RESULT = ESTRING
!?1; %END ;! OF ISOF
!
%STRING(8)%FN BIN STRING(%INTEGER M,N)
%STRING(8) WORK
LENGTH(WORK) = 8
MOVE(4,ADDR(M),ADDR(WORK)+1)
MOVE(4,ADDR(N),ADDR(WORK)+5)
%RESULT = WORK
%END ;! OF BIN STRING
!
%SYSTEMSTRING(15)%FN SFROMI (%INTEGER X)
%INTEGER REM,NUMB,NF
%STRING(15) ANS
ANS = ''
%IF X < 0 %THEN %START
NF = YES
X = X*(-1)
%FINISH %ELSE NF = NO
%CYCLE
NUMB = X
X = X//10
REM = NUMB - X*10
ANS = TOSTRING(REM+'0').ANS
%EXIT %IF X = 0
%REPEAT
%IF NF = YES %THEN ANS = "-".ANS
%RESULT = ANS
%END ;! OF SFROMI
!
%INTEGERFN IFROMS (%STRING(20) NUMBER)
%INTEGER I,J,K,L
K=ADDR(NUMBER)
J=0
%CYCLE I=1,1,20
L = BYTEINTEGER(K+I)
%IF L<'0' %OR L>'9' %THEN %RESULT = J
J=(J*10)+L-'0'
%REPEAT
%END ;! OF IFROMS
!
%ROUTINE LOG (%STRING(120) MSG)
%INTEGER CURRENT STREAM
CURRENT STREAM = OUTSTREAM
SELECT OUTPUT (LOG STREAM)
SPACES(9)
PRINTSTRING(MSG) ; NEWLINE
SELECT OUTPUT(CURRENT STREAM)
%RETURN
%END ;! OF LOG
!
!?3; %ROUTINE LOG DIAG (%STRING(120) MSG)
!?3; %INTEGER CURRENT STREAM
!?3; CURRENT STREAM = OUT STREAM
!?3; SELECT OUTPUT (DIAG STREAM)
!?3; NEWLINE
!?3; PRINTSTRING('KBB DIAG:'.MSG)
!?3; NEWLINE
!?3; SELECT OUTPUT(CURRENT STREAM)
!?3; %RETURN
!?3; %END ;! OF LOG DIAG
!
!?1; %STRING(8)%FN HEXOF (%INTEGER X)
!?1; %STRING(8) ANS
!?1; %INTEGER I
!?1; ANS = ''
!?1; %CYCLE I=0,4,28
!?1; ANS = HEXTAB((X>>I)&X'0000000F').ANS
!?1; %REPEAT
!?1; %RESULT = ANS
!?1; %END ;! OF HEXOF
!
!
%LONGINTEGERFN LONG INT (%LONGREAL X)
*LSQ _X
*RAD _R'40800000000000000000000000000000'
*RSC _47
*RSC _-47
*FIX _%B
*MYB _4
*CPB _-64
*JCC _10,
*LB _-64
LI:
*ISH _%B
*EXIT _-64
%END ;! OF LONG INT
!
%STRING(255)%FN STRING FROM (%INTEGER LENGTH,ADDRESS)
%STRING(255) S
*LB _LENGTH
*LDA _ADDRESS
*LDTB _X'18000000'
*LDB _%B
*CYD _0
*LD _S
*MVL _%L=1
*MV _%L=%DR,0,129
%RESULT = S
%END ;! OF STRING FROM
!
%ROUTINE FIND JS VAR (%STRING(8) NAME,%INTEGERNAME POINTER)
%INTEGER I
%CYCLE I=0,1,JS VAR COUNT
%IF NAME = JS VAR(I)_NAME %THEN POINTER = I %AND %RETURN
%REPEAT
POINTER = -1
%RETURN
%END ;! OF FIND JS VAR
!
!?1; %STRING(80)%FN NEXT LINE
!?1; %INTEGER I
!?1; %BYTEINTEGERARRAY LINE (0:80)
!?1; %WHILE NEXT SYMBOL = NL %THEN SKIP SYMBOL
!?1; %CYCLE I=1,1,80
!?1; READ SYMBOL(LINE(I))
!?1; %IF LINE(I) = NL %THEN %EXIT
!?1; %REPEAT
!?1; LINE(0) = I-1
!?1; %RESULT = STRING(ADDR(LINE(0)))
!?1; %END ;! OF NEXT LINE
!
%STRING(255)%FN DE SPACED (%STRING(255) S)
%STRING(255) B,A
%WHILE S -> B.(" ").A %THEN S = B.A
%RESULT = S
%END ;! OF DE SPACED
!
!?1; %ROUTINE ASK FOR STREAM(%INTEGERNAME STREAM,%STRING(15) P)
!?1; %INTEGER X,RC
!?1; %STRING(80) REPLY
!?1; !
!?1; RC = 1
!?1; PROMPT(P)
!?1; %WHILE RC > 0 %THEN %CYCLE
!?1; REPLY = DESPACED(NEXT LINE)
!?1; %IF REPLY = "" %THEN %RETURN
!?1; X = IFROMS(REPLY)
!?1; %IF X>0 %AND X<80 %THEN STREAM = X %AND %RETURN
!?1; DEFINE(SFROMI(STREAM).",".REPLY)
!?1; X = RETURN CODE
!?1; %IF X = 0 %THEN %RETURN
!?1; PRINTSTRING("REPLY NOT VALID")
!?1; NEWLINE
!?1; %REPEAT
!?1; %RETURN
!?1; %END ;! OF ASK FOR STREAM
!
!?2; %ROUTINE TRACE (%STRING(40) RTN,MSG,%INTEGER LNB,N,PPO)
!?2; %STRING (132) WORKA,WORKB
!?2; %INTEGER PPDESC ADDR,PPADDR,PPLEN,CURRENT STREAM
!?2; TRACE COUNT = TRACE COUNT + 1
!?2; WORKA="TRACE CALL >>".SFROMI(TRACE COUNT)."<< ".RTN." ".MSG
!?2; CURRENT STREAM = OUT STREAM
!?2; SELECT OUTPUT (TRACE STREAM)
!?2; NEWLINES(2)
!?2; PRINTSTRING(WORKA)
!?2; NEWLINE
!?2; WORKB="STACK DUMP STARTING FROM LNB, ".SFROMI(N)." WORDS OF PARMS"
!?2; XDUMP(WORKB,LNB,(10+N)*4)
!?2; %IF PPO > -1 %THEN %START
!?2; NEWLINE
!?2; PPDESC ADDR = LNB + 20 +(PPO*4)
!?2; PPLEN = INTEGER(PPDESC ADDR)&X'0000FFFF'
!?2; PPADDR = INTEGER(PPDESC ADDR+4)
!?2; %UNLESS PPADDR = NIL %OR PPLEN = NIL %THEN %START
!?2; WORKB="PARAMETER PAIR LIST DUMP FOLLOWS ,"
!?2; WORKB=WORKB.SFROMI(PPLEN)." WORDS IN LIST"
!?2; XDUMP(WORKB,PPADDR,PPLEN*4)
!?2; %FINISH %ELSE %START
!?2; PRINTSTRING("PARAMETER PAIR LIST IS NIL") ; NEWLINE
!?2; %FINISH
!?2; %FINISH
!?2; NEWLINE
!?2; SELECT OUTPUT(CURRENT STREAM)
!?2; !?3; LOG DIAG(WORKA)
!?2; %RETURN
!?2; %END ;! OF TRACE
!
!?2; %ROUTINE RESULT TRACE (%STRING(32) RTN NAME,%INTEGER RC)
!?2; %STRING(132) S
!?2; %INTEGER CURRENT STREAM
!?2; S = " RESULT = ".SFROMI(RC)
!?2; S = S." FROM ".RTN NAME
!?2; CURRENT STREAM=OUT STREAM
!?2; SELECT OUTPUT(TRACE STREAM)
!?2; PRINTSTRING(S)
!?2; SELECT OUTPUT(CURRENT STREAM)
!?2; !?3; LOG DIAG(S)
!?2; %RETURN
!?2; %END ;! OF RESULT TRACE
!
!?3; %ROUTINE PRINT FCT
!?3; %INTEGER I
!?3; %RECORDNAME FCR (FCR FORMAT)
!?3; !
!?3; NEWLINE
!?3; PRINTSTRING("FILE CONTROL TABLE, FILE LIMIT = ".SFROMI(FILE LIMIT))
!?3; NEWLINE
!?3; PRINTSTRING(" FILE NAME") ; SPACES(22)
!?3; PRINTSTRING(" ROUTE RAFS FORMAT ALL ACTS")
!?3; NEWLINE
!?3; %CYCLE I=0,1,FILE LIMIT
!?3; FCR == FCT(I)
!?3; %IF FCR_PC=0 %THEN -> REP
!?3; NEWLINE
!?3; WRITE(I,2) ; SPACES(4)
!?3; PRINTSTRING(FCR_OWNER.".".FCR_NAME)
!?3; SPACES(31-LENGTH(FCR_OWNER)-LENGTH(FCR_NAME))
!?3; WRITE(FCR_ROUTE,3)
!?3; WRITE(FCR_RAF SWITCH,5)
!?3; WRITE(FCR_DATA FORMAT,5)
!?3; PRINTSTRING(" ".HEXOF(FCR_ALL ACTIONS))
!?3; REP:
!?3; %REPEAT
!?3; NEWLINE
!?3; %RETURN
!?3; %END ;! OF PRINT FCT
!?3; !
!?3; %ROUTINE PRINT JSV TABLE
!?3; %INTEGER I,J,K
!?3; %RECORDNAME VAR (JS VAR RF)
!?3; !
!?3; NEWLINES(2)
!?3; PRINTSTRING("TABLE OF JOB SPACE VARIABLES, JS VAR LIMIT =")
!?3; WRITE(JS VAR LIMIT,0)
!?3; NEWLINE
!?3; %CYCLE I = 0,1,JS VAR COUNT
!?3; VAR == JS VAR(I)
!?3; NEWLINE
!?3; WRITE(I,3) ; SPACES(4)
!?3; PRINTSTRING(ISOF(VAR_NAME))
!?3; SPACES(8-LENGTH(VAR_NAME))
!?3; WRITE(VAR_MAX LEN,6)
!?3; WRITE(LENGTH(VAR_VALUE),4)
!?3; PRINTSTRING(" ".ISOF(VAR_VALUE))
!?3; %IF CHARNO(VAR_VALUE,1) < X'C1' %THEN %START
!?3; SPACES(4)
!?3; MOVE(4,ADDR(VAR_VALUE)+1,ADDR(J))
!?3; MOVE(4,ADDR(VAR_VALUE)+5,ADDR(K))
!?3; PRINTSTRING("X(".HEXOF(J).HEXOF(K).")")
!?3; %FINISH
!?3; %REPEAT
!?3; NEWLINES(2)
!?3; %RETURN
!?3; %END ;! OF PRINT JSV TABLE
!
!
!***********************************************************************
!*
!* QUIT
!*
!**********************************************************************
!
! THIS ROUTINE IS CALLED TO FORCE A RETURN TO COMMAND LEVEL.
! THE RETURN IS MADE VIA THE LNB SAVED ON INITIAL ENTRY (BASICBASE)
! FOR THE PURPOSE.
!
%EXTERNALROUTINE SSQT (%INTEGER RESULT CODE)
%INTEGER X,RC
!?2; *STLN _X
!?2; TRACE("QUIT","",X,1,-1)
!CLEAR FILES
SET RETURN CODE (RESULT CODE)
!
! JUST IN CASE THERE ARE ANY REMAINING QUEUED INTERRUPTS
! DO A DDISC ID TO CLEAR THEM. IF THERE ARE ANY THE
! CALL ON DISC WILL HAVE HE EFFECT OF INVOKING ANOTHER ENTRY
! INTO THE "BBONTRAP" ROUTINE. HIS SHOULD ENABLE ALL QUEUED
! INTERRUPTS TO BE CLEARED BEFORE RETURN TO COMMAND
! LEVEL.
!
RC = DISC ID
DRESET CONTINGENCY
X = ENTRY LNB
*LLN_X ;! RESTORE LNB AND RETURN AS IF
*EXIT_-64 ;! FROM ENTRY ROUTINE, BASICBASE
%END ;! OF QUIT
!
!**********************************************************************
!*
!* ABANDON
!*
!**********************************************************************
!
%ROUTINE ABANDON (%INTEGER OPTIONS,%STRING(120) COMMENT)
! RETURN TO COMMAND LEVEL
! OPTION 1 => RETURN WITHOUT DIAGS
! 2 => LANGUAGE DIAGS
! 3 => STACK DUMP
! 4 => TOTAL DUMP
!
%UNLESS COMMENT = '' %THEN LOG(COMMENT.' - ABANDONING')
!
! OTHER DUMPING CODE IN HERE
!
SSQT(1000)
%END ;! OF ABANDON
!
!**********************************************************************
!*
!* SET CONTINGENCY
!*
!**********************************************************************
!
%EXTERNALINTEGERFN SET CONTINGENCY (%LONGINTEGER DESC,MASK)
%INTEGER I
%LONGINTEGER X
!?2; *STLN _I
!?2; TRACE("SET CONTINGENCY","",I,4,-1)
X=MASK
%CYCLE I = 0,1,63
%IF X&X'0000000000000001' = 0 %THEN CONT RTN DESC(I) = DESC
X = X>>1
%REPEAT
%RESULT = 0
%END ;! OF SET CONTINGENCY
!
!**********************************************************************
!*
!* READ INTERRUPT DATA
!*
!**********************************************************************
!
%EXTERNALINTEGERFN READ INTERRUPT DATA (%INTEGER ID DR0,ID DR1)
%INTEGER L,RC
!?2; *STLN _L
!?2; TRACE("READ INTERRUPT DATA","",L,2,-1)
%IF INT DATA FLAG = NO %THEN %RESULT = X'F02'
RC = 0
L= ID DR0 & X'00FFFFFF'
%IF L < 18 %THEN RC = -1
%IF L > 18 %THEN L = 18
MOVE (L * 4,ADDR(INT DATA(0)),ID DR1)
%RESULT = RC
%END ;! OF READ INTERRUPT DATA
!
!**********************************************************************
!*
!* DISCARD INTERRUPT DATA
!*
!**********************************************************************
!
%EXTERNALINTEGERFN DISCARD INTERRUPT DATA
!?2; %INTEGER X
!?2; *STLN _X
!?2; TRACE("DISCARD INTERRUPT DATA","",X,0,-1)
!
! SINCE A CALL ON DIRECTOR'S DISC ID INTERFACE IS MADE
! IMMEDIATELY ON RECEIVING AN INTERRUPT (SEE BBONTRAP)
! THERE IS NO NEED TO DO ANYTHING HERE EXCEPT TO SET A
! FLAG TO INDICATE WHETHER OR NOT BASIC HAS "DISCARDED".
! THIS IS THE SAME AS A CHECK ON WHETHER THERE SHOULD BE
! MEANINGFULL INTERRUPT DATA AVAILABLE.
!
%IF INT DATA FLAG = NO %THEN %RESULT = X'F02'
INT DATA FLAG = NO
%RESULT = 0
%END ;! OF DISCARD INTERUPT DATA
!
!**********************************************************************
!*
!* BBONTRAP
!*
!**********************************************************************
!
%EXTERNALROUTINE BBONTRAP (%INTEGER CLASS,SUBCLASS)
%INTEGER KCLASS,RC,X
!?2; %INTEGER CURRENT STREAM
!
%LONGINTEGER DESC
!
!?2; *STLN _X
!?2; TRACE("BBONTRAP","",X,2,-1)
KCLASS = CONTINGENCY MAP(CLASS) - 1
%IF KCLASS < 0 %THEN %START
ABANDON(0,'CONTINGENCY CLASS '.SFROMI(CLASS).', SUBCLASS '. %C
SFROMI(SUBCLASS))
%FINISH
%IF INT DATA FLAG = YES %THEN %START
ABANDON(2,'ERROR ON ERROR')
%FINISH
RC = READ ID (ADDR(INT DATA(0)))
%IF RC # 0 %THEN ABANDON(1,'NO INT DATA AFTER INTERRUPT')
INT DATA FLAG = YES
!?2; CURRENT STREAM = OUT STREAM
!?2; SELECT OUTPUT (TRACE STREAM)
!?2; XDUMP ("INTERRUPT DATA",ADDR(INT DATA(0)),18*4)
!?2; %MONITOR
!?2; SELECT OUTPUT (CURRENT STREAM)
!
! THE FOLLOWING CALL ON DISC ID EFFECTIVELY INFORMS
! DIRECTOR THAT THE CURRENT INTERRUPT HAS BEEN DEALT WITH.
! ALTHOUGH THIS IS NOT STRICTLY TRUE UNTIL BASIC'S
! CONTINGENCY ROUTINE HAS PROCESSED IT, IT MUST BE POSSIBLE FOR
! FURTHER ASYNCRONOUS INTERRUPTS TO GET THROUGH, TO KILL
! DIAGNOSTIC OUTPUT, SAY.
!
RC = DISC ID
DESC = CONT RTN DESC(KCLASS)
%IF DESC = 0 %THEN ABANDON(1,'NO RTN TO HANDLE CLASS '.SFROMI(KCLASS) %C
.'CONTINGENCY')
!
! ENTER MACHINE CODE SEQUENCE TO CALL THE CONTINGENCY ROUTINE
! SPECIFIED BY THE CONTENTS OF 'DESC'
!
*LD _DESC
*STLN _%TOS
*ASF _4
*LSS _SUBCLASS
*SLSS _KCLASS
*ST _%TOS
*RALN _7
*CALL _(%DR)
!
! IF BASIC RETURNS TO HERE THEN A NORMAL RETURN HAS BEEN
! MADE FROM BASIC'S CONTINGENCY HANDLING ROUTINE WHICH
! IMPLIES A NEED TO RESUME AT THE POINT OF INTERRUPTION.
! CHECK TO SEE IF INT DATA HAS
! BEEN DISCARDED. IF YES THEN DUMP. IF NOT RESUME AT
! ENVIRONMENT DESCRIBED BY INT DATA
!
%IF INT DATA FLAG = NO %THEN %C
ABANDON(1,'NO INT DATA FOR NORMAL RETURN')
INT DATA FLAG = NO
DRESUME(0,0,ADDR(INT DATA(0)))
%END ;! OF BBONTRAP
!
!
!**********************************************************************
!*
!* ENTRY ROUTINE FOR KENT BASIC INTERFACE
!*
!**********************************************************************
!
%EXTERNALROUTINE BASIC(%STRING(255) PARMS)
%INTEGER X,RC,I,CURRENTSTREAM
*STLN_X ;! ( SAVE LNB AT ENTRY FOR USE IN
ENTRY LNB = X ;! ( EXIT FROM QUIT
!?2; TRACE COUNT = 0
!?3; DIAG STREAM = 60
LOG STREAM = 61
!?2; TRACE STREAM = 62
!?3 %C
DEFINE("61,.OUT")
!?3; ASK FOR STREAM (DIAG STREAM,"DIAG STREAM? ")
!?3; ASK FOR STREAM (LOG STREAM,"LOG STREAM? ")
!?2; ASK FOR STREAM (TRACE STREAM,"TRACE STREAM? ")
FILL(64*8,ADDR(CONT RTN DESC(0)),X'00')
INT DATA FLAG = NO
INITIAL CPU TIME = CPU TIME
IT PROMPT FLAG = YES ;! IE REQUIRING PROMPT TO BE REFRESHED
!
!
JS VAR(0)_NAME = E"RESULT" ;!) SET UP FIRST JS VAR
JS VAR(0)_VALUE = BIN STRING(0,0) ;!) IN JS VAR LIST
;!) SUCH THAT THE
JS VAR(0)_MAX LEN = 8 ;!) POINTERS IN THE ROUTINE
JS VAR COUNT = 0 ;!) 'CREATE JS VAR' WORK PROPERLY
USER NAME = UINFS (1)
! PROCESS PARAMS
%UNLESS PARMS->INPUTFILE.(",").PARMS %THEN %START
INPUTFILE=PARMS
OUTPUTFILE=""
%FINISH %ELSE %START
%UNLESS PARMS->OUTPUTFILE.(",").PARMS %THEN OUTPUTFILE=PARMS
%FINISH
!
EXEC MODE = UINFI(2)
%IF EXEC MODE = FOREGROUND %THEN %START
X = CREATE JS VAR (E"ICL9XJST",BIN STRING(0,0),-1)
FIND JS VAR (E"ICL9XJST",X)
LENGTH(JS VAR(X)_VALUE) = 4
%FINISH
!
! NOW FOR SEQUENCE TO SET UP ENTRY FOR BASIC PROPER
!
CURRENT STREAM = OUT STREAM
!?3; -> BYPASS
DEFINE("20,.NULL")
SELECT OUTPUT(20)
!?3; BYPASS:
SELECT OUTPUT(CURRENT STREAM)
!
! NOW SET UP CONTINGENCY HANDLIG
!
!?3; PROMPT("CONTINGENCIES?")
!?3; %IF DE SPACED(NEXTLINE)="NO" %THEN ->LAB2
RC = PRIME CONTINGENCY (BBONTRAP)
%IF RC # 0 %THEN ABANDON(0,"FAILED TO PRIME CONTINGENCIES")
!?3; LAB2:
!
KBASC(NIL,NIL)
!
! SHOULD RETURN TO HERE FROM BASIC
!
%RETURN
%END ;! OF BASICBASE
!
!**********************************************************************
!*
!* JS WRITE
!*
!**********************************************************************
!
%EXTERNALINTEGERFN JS WRITE (%INTEGER NAME DR0,NAME DR1, %C
NIL0,NIL1, %C
VAL DR0,VAL DR1)
%INTEGER RC,POINTER
%STRING(80) VALUE
!?2; %STRING(80) TTWORK
%STRING(8) NAME
!
! NOTE THAT ALL JS VARS ARE STORED IN EBCDIC
!
!
!?2; *STLN _RC
!?2; TTWORK=STRINGFROM(NAME DR0,NAME DR1)
!?2; ETOI(ADDR(TTWORK)+1,LENGTH(TTWORK))
!?2; TRACE("JS WRITE",TTWORK,RC,6,-1)
%IF NAME DR0&X'000000FF' > 8 %THEN %RESULT = X'401'
%IF VAL DR0 & X'000000FF' > 80 %THEN %RESULT = X'403'
RC = 0
NAME = STRING FROM (NAME DR0,NAME DR1)
VALUE = STRING FROM (VAL DR0,VAL DR1)
FIND JS VAR (NAME,POINTER)
%IF POINTER = -1 %THEN %RESULT = CREATE JS VAR (NAME,VALUE,-1)
! JS VAR FOUND, NEED TO UPDATE VALUE
%IF LENGTH(VALUE) > JS VAR(POINTER)_MAX LEN %THEN %C
LENGTH(VALUE) = JS VAR(POINTER)_MAX LEN %AND RC = -1
JS VAR(POINTER)_VALUE = VALUE
%RESULT = RC
%END ;! OF JS WRITE
!
!
!**********************************************************************
!*
!* JS READ
!*
!**********************************************************************
!
%EXTERNALINTEGERFN JS READ (%INTEGER NAME DR0,NAME DR1, %C
NIL0,NIL1, %C
VAL DR0,VAL DR1)
%INTEGER POINTER,VAL LEN,RC
%STRING(80) VALUE
!?2; %STRING(80) NAME
!
!?2; *STLN _RC
!?2; NAME = STRING FROM (NAME DR0,NAME DR1)
!?2; ETOI(ADDR(NAME)+1,LENGTH(NAME))
!?2; TRACE("JS READ",NAME,RC,6,-1)
RC = 0
VAL LEN = VAL DR0 & X'0000FFFF'
%IF NAME DR0 & X'000000FF' > 8 %THEN RC = X'401' %AND -> OUT
VALUE = STRING FROM(NAME DR0,NAME DR1) ;! USE VALUE TEMPORARILY
%WHILE CHARNO(VALUE,LENGTH(VALUE)) = X'40' %THEN %C
LENGTH(VALUE)=LENGTH(VALUE)-1
FIND JSVAR(VALUE,POINTER)
%IF POINTER = -1 %THEN RC = X'B03' %AND -> OUT
VALUE = JS VAR(POINTER)_VALUE
FILL(VAL LEN,VAL DR1,64) ;! SPACE FILL AREA FOR RETURN VALUE
%IF VAL LEN < LENGTH(VALUE) %THEN LENGTH(VALUE) = VAL LEN %AND RC=-1
MOVE(LENGTH(VALUE),ADDR(VALUE)+1,VAL DR1)
OUT:
!?2; RESULT TRACE("JS READ",RC)
%RESULT = RC
%END ;! OF JS READ
!
!
!**********************************************************************
!*
!* LOG MESSAGE
!*
!**********************************************************************
!
%EXTERNALINTEGERFN LOG MESSAGE (%INTEGER NIL0,NIL1, %C
MSG DR0,MSG DR1)
%INTEGER RC,L,DSTREAM,CURRENT STREAM
%STRING(138) S
DSTREAM = LOG STREAM
RC = 0
L = MSG DR0&X'000000FF'
%IF L > 108 %THEN L = 108 %AND RC = -1
CURRENT STREAM = OUTSTREAM
SELECT OUTPUT(LOG STREAM)
S = STRING FROM (L,MSG DR1)
ETOI(ADDR(S)+1,L)
PRINTSTRING(TIME." ".S)
NEWLINE
SELECT OUTPUT(CURRENT STREAM)
%RESULT = RC
%END ;! OF LOG MESSAGE
!
!
!*
!**********************************************************************
!*
!* GIVE PROCESS TIME
!*
!**********************************************************************
!
!
%EXTERNALINTEGERFN GIVE PROCESS TIME (%INTEGER TOTAL, %C
PT DR0,PT DR1)
%LONGINTEGER ANSWER
%LONGREAL REQUIRED CPU TIME
!?2; %INTEGER X
!?2; *STLN _X
!?2; TRACE("GIVE PROCESS TIME","",X,3,-1)
REQUIRED CPU TIME = CPU TIME
%IF TOTAL = 1 %THEN %C
REQUIRED CPU TIME = REQUIRED CPU TIME - INITIAL CPU TIME
ANSWER = LONGINT(REQUIRED CPU TIME * 1000)
LONGINTEGER(PT DR1) = ANSWER
%RESULT = 0
%END ;! OF GIVE PROCESS TIME
!
!
!**********************************************************************
!*
!* GIVE DATE AND TIME
!*
!**********************************************************************
!
%EXTERNALINTEGERFN GIVE DATE AND TIME (%INTEGER %C
DATE DR0,DATE DR1, %C
TIME DR0,TIME DR1, %C
DATE FORMAT)
%CONSTINTEGERARRAY MD MAP (1:12) = 0,31,59,90,120,154, %C
181,212,243,273,304,334
%CONSTSTRING(3)%ARRAY MONTH NAME (1:12) = 'JAN','FEB','MAR',
'APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'
%STRING(8) WORK
%STRING(2) DAY,MONTH,YEAR
%INTEGER NMONTH,NDAYS,NYEAR,L,RC
%SWITCH FORMAT (0:2)
!
!?2; *STLN _RC
!?2; TRACE("GIVE DATE AND TIME","",RC,5,-1)
RC = 0
%IF TIME DR1 # NIL %THEN %START
WORK = TIME
L = TIME DR0 & X'000000FF'
ITOE(ADDR(WORK)+1,8)
%IF L > 8 %THEN L = 8
%IF L < 8 %THEN RC = -2
MOVE(L,ADDR(WORK)+1,TIME DR1)
%FINISH
%IF DATE DR1 # NIL %THEN %START
L = DATE DR0 & X'000000FF'
WORK = DATE
DAY = FROM STRING (WORK,7,8)
MONTH = FROM STRING (WORK,4,5)
YEAR = FROM STRING (WORK,1,2)
NMONTH = IFROMS(MONTH)
-> FORMAT ( DATE FORMAT)
FORMAT(0): ;! DDMMMYY , EG. 05SEP77
WORK = DAY.MONTH NAME(NMONTH).YEAR
-> OUT
FORMAT(2): ;! DDD/77 , EG. 248/77
NDAYS = MD MAP(NMONTH) + IFROMS(DAY)
NYEAR = IFROMS(YEAR)
%IF NMONTH > 2 %AND NYEAR-((NYEAR//4)*4) = 0 %THEN %C
NDAYS = NDAYS + 1
WORK = SFROMI(NDAYS)."/".YEAR
FORMAT(1): ;! YY/MM/DD EG. 77/09/05
OUT: ITOE(ADDR(WORK)+1,8)
%IF L > 8 %THEN L = 8
%IF L < 8 %THEN RC = RC + 1
MOVE(L,ADDR(WORK)+1,DATE DR1)
%FINISH
%RESULT = RC
%END ;! OF GIVE DATE AND TIME
!
!
!**********************************************************************
!*
!* CREATE AREA
!*
!**********************************************************************
!
!
%EXTERNALINTEGERFN CREATE AREA (%INTEGER %C
NAME DR0,NAME DR1, %C
P DR0,P DR1, %C
A DR0,A DR1)
!
! THE ROW OF WORDS PASSED AS THE PARAMETER PAIR LIST IS MAPPED
! ONTO AN INTEGER ARRAY, PPLIST, USING AN INTEGER ARRAY
! FORMAT, PPF, WITH DYNAMIC BOUNDS, THE BOUNDS BEING
! BEING CALCULATED FROM THE LENGTH FIELD OF THE DESCRIPTOR
! FOR THE PARAMETER PAIRS. AN ARRAY OF POINTERS, IDPTR, EACH
! ELEMENT OF WHICH CORRESPONDS TO A PARM PAIR IDENTIFIER, IS
! INITIALISED SUCH THAT THE NTH ELEMENT POINTS TO THE
! FIRST WORD (IDENTIFIER) OF THE PARM PAIR WITH IDENTIFIER N.
! THE LENGTH OF THE ARRAY IDPTR IS DETERMINED BY THE
! LOWEST AND HIGHEST NUMERICAL VALUES OF THE PARM PAIR
! IDENTIFIERS EXPECTED.
! SEE K-SV9 BUPI MANUAL FOR FULL EXPLANATION OF THE PARM
! MECHANISM.
!
! THE ONLY TWO PARM PAIRS OF INTEREST TO EMAS WRT THIS
! INTERFACE ARE SIZE AND MAXSIZE, IDENTIFIERS 1 AND 7
! RESPECTIVLY. THE ACCESS PERMISSION IS SET TO WRITE
! AS THERE IS LITTLE POINT IN CONNECTING TO A NEW AREA IN OTHER
! THAN WRITE MODE.
!
! THIS LAST POINT MAY HAVE TO BE REVISED TO TAKE ACCOUNT OF
! THINGS LIKE READ AND WRITE INITIAL PERMISSION.
!
%INTEGERARRAYFORMAT PPF (0:(P DR0 & X'00FFFFFF') - 1)
%INTEGERARRAYNAME PP LIST
%INTEGERARRAY IDPTR (0:14)
%INTEGER I,SIZE,MAX SIZE,FLAG,AREA ADDR,PPLIST LENGTH
!?2; %INTEGER X
%STRING(30) FILE NAME
!
!?2; *STLN _X
!?2; TRACE("CREATE AREA","",X,6,2)
PPLIST LENGTH = P DR0 & X'00FFFFFF'
PP LIST == ARRAY(P DR1,PPF)
FILL (15*4,ADDR(IDPTR(0)),X'FF')
%CYCLE I = 0,2,PPLIST LENGTH - 2
IDPTR(PPLIST(I))=I
%REPEAT
%IF IDPTR(1) > -1 %THEN SIZE = PPLIST(IDPTR(1)+1) %C
%ELSE %RESULT = X'101'
%IF IDPTR(7) > -1 %THEN %START
MAX SIZE = PPLIST(IDPTR(7)+1)
%IF MAX SIZE < SIZE %THEN %RESULT = X'E03'
%FINISH %ELSE MAX SIZE = SIZE
FILE NAME = "T#".NEXT TEMP
OUT FILE (FILENAME,SIZE,MAX SIZE,0,AREA ADDR,FLAG)
%IF FLAG # 0 %THEN %START
LOG ('FAILURE FROM EMAS ''OUTFILE'' = ' %C
.SFROMI(FLAG))
%RESULT = X'E08'
%FINISH
INTEGER(A DR1) = X'18000000' ! SIZE
INTEGER(ADR1+4) = AREA ADDR
%RESULT = 0
%END ;! OF CREATE AREA
!
!**********************************************************************
!*
!* DELETE AREA
!*
!**********************************************************************
!
!
%EXTERNALINTEGERFN DELETE AREA (%INTEGER A DR0,A DR1)
%STRING(31) FILE NAME
%INTEGER RC
!
!?2; *STLN _RC
!?2; TRACE("DELETE AREA","",RC,2,-1)
FILE NAME = CONFILE(ADR1)
%IF FILE NAME = '.NULL' %THEN %RESULT = X'401'
DESTROY(FILE NAME,RC)
%IF RC # 0 %THEN %RESULT = X'E0B'
%RESULT = 0
%END ;! OF DELETE AREA
!
!**********************************************************************
!*
!* UPDATE AREA LOCAL PROPERTIES
!*
!**********************************************************************
!
!
%EXTERNALINTEGERFN UPDATE AREA LOCAL PROPERTIES (%INTEGER %C
A DR0,A DR1, %C
P DR0,P DR1)
!
! SEE CREATE AREA FOR DETAILS OF HANDLING OF PARAMETER PAIRS
!
! THE ONLY PROPERTIES OF INTEREST HERE ARE THOSE WHICH IMPLY
! A CHANGE IN AREA SIZE OR A CHANGE IN ACCESS PERMISSION TO THE
! THE AREA SPECIFIED. THE PARM PAIR ID'S OF INTEREST ARE
! AS FOLLOWS:
! 1 AREA SIZE
! 2 READ ACCESS
! 3 WRITE ACCESS
! 4 EXECUTE ACCESS
%INTEGERARRAYFORMAT PPF (0:(P DR0 & X'00FFFFFF') - 1)
%INTEGERARRAYNAME PPLIST
%INTEGERARRAY IDPTR (0:14)
%STRING(15) FILE NAME
%INTEGER RC,NA,I,PPLIST LENGTH
!?3; %INTEGER CURRENT STREAM
!?3; %STRING(100) DWORK
!
!?2; *STLN _RC
!?2; TRACE("UPDATE ALP","",RC,4,2)
PPLIST LENGTH = P DR0 & X'00FFFFF'
PP LIST == ARRAY(P DR1,PPF)
FILL(15*4,ADDR(IDPTR(0)),X'FF')
%CYCLE I = 0,2,PPLIST LENGTH - 2
IDPTR(PPLIST(I)) = I
%REPEAT
!
!?3; CURRENT STREAM=OUTSTREAM
!?3; SELECTOUTPUT(DIAGSTREAM)
!?3; DWORK="ENTERED UALP---FCR FOLLOWS"
!?3; XDUMP(DWORK,ADR1,120)
!?3; SELECTOUTPUT(CURRENTSTREAM)
FILE NAME = CONFILE(A DR1)
%IF FILE NAME = '.NULL' %THEN %RESULT = X'401'
%IF IDPTR(1) > -1 %THEN %START
! CHANGE FILE SIZE
CHANGE FILE SIZE(FILE NAME,PPLIST(IDPTR(1)+1),RC)
%IF RC # 0 %THEN %RESULT = X'E03'
%FINISH
NA = 0
%IF IDPTR(2) > -1 %THEN NA = 1
%IF IDPTR(3) > -1 %THEN NA = NA + 2
%IF IDPTR(4) > -1 %THEN NA = NA + 4
%IF NA > 0 %THEN %START
CHANGE ACCESS (FILE NAME,NA,RC)
%IF RC # 0 %THEN %RESULT = X'E03'
%FINISH
%RESULT = 0
%END ;! OF UPDATE AREA LOCAL PROPERTIES
!
%EXTERNALINTEGERFN DELETEFILE
%RESULT=0
%END
!
%ENDOFFILE
BP DR0 = NIL ; BP DR1 = NIL