,POPR,BSIZE,PPTAB .REF CRDON,LPON,CRDOFF,LPOFF,LOGMAX .REF DLCST,MPQST,MSQST,OUTST,RTEST .RAY SSTACK = . ; BEGIN SYSTEM STACK HERE FOR ROS I .ENDC PSR = 177776 ; PR ; TASK'S ABORT/TIME-SLICE TIME $TYPE3: .WORD 0 ; 1= CURRENTLY ACTIVE TASK I/O ; R4),$HQPR ; YES QUECXX = . TST (SP)+ ; POP OFF TOP OF STACK (TEMP ERROR STAT) QUEC16 =. ; UPDATE 1/26/73 FLMGMT.C03 ; UPDATE 1/6/73 FLMGMT.C03 ; UPDATE 1/6/73 FLMGMT.C02 ; UPDATE 12/12/72 FLMGMT.C01 ; UPDATE 6/27/72 FLMGMT.S09 ; UPDATE 4/10/72 FLMGMT.S08 ; UPDATE 4/5/72 FLMGMT.S07 ; UPDATE 3/31/72 FLMGMT.S06 ; UPDATE 3/23/72 FLMGMT.S05 ; UPDATE 3/21/72 FLMGMT.S04 ; UPDATE 3/21/72 FLMGMT.S03 ; UPDATE 3/20/72 ; UPDATE 1/31/73 INPUT.C06 ; UPDATE 1/26/73 INPUT.C05 ; UPDATE 1/5/73 INPUT.C04 ; UPDATE 1/4/73 INPUT.C03 ; UPDATE 12/8/72 INPUT.C02 ; UPDATE 10/18/72 INPUT.C01 ; UPDATE 6/28/72 INPUT.S22 ; UPDATE 6/24/72 INPUT.S21 ; UPDATE 6/23/72 INPUT.S20 ; UPDATE 6/22/72 INPUT.S19 ; UPDATE 5/5/72 INPUT.S18 ; UPDATE 5/2/72 ; UPDATE 1/30/73 ROSLOD.C05 ;UPDATE: 12-19-72 ROSLOD.C04 ;12-19-72 ; UPDATE 12/12/72 ROSLOD.C03 ; UPDATE 12/8/72 ROSLOD.C02 ; UPDATE 10/11/72 ROSLOD.C01 (FIX ERRPRT) ; UPDATE: 16-JUN-72 ROSLOD.S72 ; ORIGIN: 11-MAY-72 ROSLOD.S71 ; ******************************************************************** ; * * ; ; UPDATE 1/20/73 IPL2.C05 ; UPDATE 11/20/72 IPL2.C04 ; UPDATE 1106/72 IPL2.C03 ; UPDATE 10/20/72 IPL2.C02 ; UPDATE 10/18/72 IPL2.C01 ; UPDATE 6/22/72 IPL2.S27 ; UPDATE 5/17/72 IPL2.S26 ; UPDATE 5/16/72 IPL2.S25 ; UPDATE 5/16/72 IPL2.S24 ; UPDATE 5/5/72 IPL2.S23 ; UPDATE 5/2/72 IPL2.S22 ; UPDATE 4/17/42 IPL2.S21 ; FLMGMT.S02 ; UPDATE 3/20/72 FLMGMT.S01 .TITLE FLMGMT ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION. FLMGMT; ROS FILE MANAGEMENT. * ;* DEFINE, CATALOG NUMBER ; * ;* DELETE , CATALOG NUMBER ; * ;* PRTCT,CATALOG NUMBER INPUT.S17 ; UPDATE 4/21/72 INPUT.S16 ; UPDATE 4/10/72 INPUT.S15 ; UPDATE 3/31/72 INPUT.S14 ; UPDATE 2/16/72 INPUT.S13 ; UPDATE 1/28/72 INPUT.S12 ; UPDATE 1/18/72 INPUT.S11 ; UPDATE 12/20/71 INPUT.S10 ; UPDATE 12/15/71 INPUT.S09 ; UPDATE 12/11/71 INPUT.S08 ; UPDATE 12/10/71 INPUT.S07 ; UPDATE 12/2/71 INPUT.S06 ; * ****************** R O S L O D ******************* ; * THIS IS THE ON-LINE LINKING LOADER FOR THE "ROS II" SYSTEM * ; * TO BE RUN ON THE PDP-11/20. THIS VERSION WILL LINK UP TO * ; * "MXOBJ" OBJECT MODULES WHICH ARE STORED IN THE BATCH FILE ON * ; * DISC.. "MXOBJ" IS A SYSGEN PARAMETER. A LOAD MODULE WILL * ; * BE CREATED WHICH IS RELOCATABLE BY EXECUTING AT LOAD TIME A * ; * "TRAILER" PROGRAM ATTACHED TO THE END OF THE MAIN PROGRAM. UPDATE 4/14/72 IPL2.S20 ; UPDATE 4/12/72 IPL2.S19 ; UPDATE 4/10/72 IPL2.S18 ; UPDATE 4/5/72 IPL2.S17 ; UPDATE 3/23/72 IPL2.S16 ; UPDATE 3/21/72 IPL2.S15 ; UPDATE 3/20/72 IPL2.S14 ; UPDATE 3/17/72 IPL2.S13 ; UPDATE 3/13/72 IPL.S12 ; UPDATE 2/16/72 IPL2.S11 ; UPDATE 1/19/72 IPL2.S10 ; UPDATE 1/12/72 IPL2.S09 ; UPDA ; * ;* UNPRCT, CATALOG NUMBER . * ;* * ;* PURPOSE. THE ROS FILE MANAGEMENT PROGRAM CONSISTS OF FOUR * ;* CORE RESIDENT SUBROUTINES WHOSE PURPOSE IS TO PROVIDE A * ;* BASIC DISC FILE UTILITY PACKAGE IN A ROS II OR III SYSTEM. * ;* FLMGMT WILL BE RESPONSIBLE FOR THE QUEUEING AND DIS- * ;* PATCHING OF FILE MANAGEMENT REQUESTS. UPDATE 11/12/71 INPUT.S05 ; UPDATE 11/10/71 INPUT.S04 ; UPDATE 11/8/71 INPUT.S03 ; UPDATE 11/1/71 INPUT.S02 ; UPDATE 10/8/71 INPUT.S01 .TITLE INPUT ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION. INPUT, CATALOG NO. ; * ;* OPERATOR INPUT PROCESSING.  * ; * ALTHOUGH ALL SYMBOLS WITH ABSOLUTE VALUES, WHETHER BY VIRTUE OF* ; * APPEARING IN AN "ASECT" OR DUE TO AN ABSOLUTE EQUATE, WILL BE * ; * REFERENCED CORRECTLY, TEXT IN ABSOLUTE SECTIONS WILL NOT BE * ; * LOADED. THIS IS BECAUSE THE MODULES ARE RUN-TIME RELOCATABLE, * ; * AND NO GUARANTEE CAN BE MADE THAT THE SPECIFIED MEMORY * ; * LOCATIONS WILL BE FREE AT LOAD TIME. * ; * "CSECTS", BOTH BLANK AND NAMED, ARE PROCESSED NORMALLYTE 12/11/71 IPL.S08 ; UPDATE 12/10/71 IPL.S07 ; UPDATE 12/2/71 IPL.S06 ; UPDATE 11/18/71 IPL.S05 ; UPDATE 11/15/71 IPL.S04 ; UPDATE 11/12/71 IPL.S03 ; UPDATE 11/11/71 IPL.S02 ; UPDATE 11/10/71 IPL.S01 .TITLE IPL ;*********************************************************************** ;* * ;* INITIAL THE OPERATOR * ;* DEMAND FILE UTILITY PACKAGE (ODFUP) IS NOT CONTAINED * ;* IN FILE MANAGEMENT, BUT USES THESE COMMON SUBROUTINES. * ;* ODFUP IS PART OF THE OPERATOR DEMAND TASK 'INPUT'. * ;* * ;* THE FOUR SUBROUTINE ENTRY POINTS PROVIDED FOR * ;* IN FLMGMT ARE: * ;*  * ;* * ;* PURPOSE. THIS TASK WILL REQUEST AND ACCEPT OPERATOR REQUESTS * ;* FROM THE SYSTEM TTY; AND, IF PRECEDED BY A PROPER AUTHORIZATION* ;* CODE, THE REQUEST WILL BE PROCESSED. VALID OPERATOR REQUESTS, * ;* FORMAT AND FUNCTION ARE: * ;* * ;* FORMAT PROGRAM(SEGMENT)FUNCTI. * ; * THE LOAD MAP PRINTED AT THE END OF PASS 1 WILL SHOW THE VALUES * ; * OF ALL GLOBAL SYMBOLS (ENTRY POINTS, MODULE AND SECTION NAMES) * ; * EXPRESSED AS A RELATIVE OFFSET FROM THE BASE OF THE LOAD MODULE* ; * OBVIOUSLY, THE ABSOLUTE LOAD VALUES CANNOT BE KNOWN UNTIL THE * ; * MODULE IS RELOCATED AT EXECUTION TIME. IN ADDITON, THE * ; * LOAD MAP WILL SHOW THE ACCUMULATED LOAD MODULE SIZE AT THE * ; * START OF EACH OBJECT MODULE ON THE MAP, AND MUPROGRAM LOAD WILL INITIALIZE THE ROS SYSTEM AND * ;* THEN EXIT TO DISPATCH. THIS MODULE SHOULD BE EXECUTED * ;* BEFORE ENTERING ROS FOR THE FIRST TIME. * ;* * ;* PROGRAMMER 51,52,53 AND 54 * ;* DATE 11/9/71 * ;* REVISION ;* REVISION  * ;* DEFINE - SUBROUTINE TO ALLOCATE A FILE SPACE AND * ;* CREATE A FILE DIRECTORY ENTRY. * ;* DELETE - SUBROUTINE THAT WILL DELETE A FILE DIRECTORY * ;* ENTRY. * ;* PRTCT - SUBROUTINE THAT WILL SET THE PROTECT STATUS * ;* IN A DIRECTORY ENTRY. * ;* UNPRCT - SUBROUTINE TON * ;* ************************************************************* * ;* CCCC INPUT INPUT OF AUTHORIZATION CODE * ;* EN,NNN ENABLE ENABLE SPECIFIED TASK * ;* DS,NNN DSABLE DISABLE SPECIFIED TASK * ;* QU,NNN QTASK QUEUE SPECIFIED TASK * ;* XX,NNN TABORT ABORT SPECIFIED TASK * ;* TM,HH:MM TIME LTIPLE GLOBAL * ; * SYMBOL DEFINITIONS WILL BE FLAGGED WITH AN "M". * ; * WHEN LOADING TASKS, "ROSLOD" UPDATES THE MONITOR'S TASK TABLES * ; * TO ALLOW THE NEW PROGRAM TO BE QUEUED AND EXECUTED. * ; * FURTURE RELEASES OF "ROSLOD" WILL ALLOW LIBRARY SEARCHES AND * ; * * ; * VERSION:007.001 * ; * DATE: 11-MAY-72  * ;* * ;*********************************************************************** .DEF IPL,SSTACK .DEF DYNSIZ ; # BYTES IN DYNAMIC POOL .DEF ENDDYN,DYSINI ; ******** .REF CLINIT .REF RQUEST,SAVE,DSPTCH,TPRTY,HEADER .REF PFSIPL,PSTIPL .REF TSTAT,SYSINI,DINT .REF EMTINIT .REF HAT WILL RESET THE PROTECT STATUS * ;* IN A DIRECTORY ENTRY. * ;* * ;* PROGRAM USAGE. THE LINKAGE TO SUBROUTINE DEFINE IS: * ;* * ;* MOV #LIST,-(SP) * ;* EMT DEFINE * ;*  SET TIME-OF-DAY * ;* TM TIME TYPE TIME OF DAY * ;* DT,MM/DD/YY DATE SET DATE * ;* DT DATE TYPE DATE * ;* RE,YYY RESET RESET DEVICE AVAILABLE * ;* EX INPUT TERMINATE INPUT * ;* C/R TERMINATE INPUT * ;*  * ; * PROGRAMMER: 52 * ; * * ; ******************************************************************** .TITLE ROSLOD .DEF LODHED .REF PPTAB,TASKS,TPRTY,TSTAT,IOSTAT,HEADER,BSIZE,IFD .REF PFRITE,$TKFLS ;SECONDARY INPUT PARAMETERS: ; TASMAX,NPRIOR,OVTMIN,MAXID1,NDISCS,$SYSFL,$OVTYP,ARG,$BCHID ; $LSD PRTINT,KBDINT ;TTYIO PRINTER AND KEYBOARD ;INTERRUPT ROUTINES .REF TTINIT ;TTYIO INITIALIZATION SUBROUTINE .REF TTYOUT,QUEUE,MTINT ; ******** .REF ASYNCI ; ******** .IFG NLP ; ONLY IF HAVE LINE PRINTERS .REF LPINIT .ENDC .IFG NCR ; ONLY IF HAVE CARD READERS .REF  * ;* OR THE FORTRAN EQUIVALENT: * ;* * ;* CALL FORTRAN(LIST) * ;* * ;* THE LINKAGE TO SUBROUTINE DELETE IS: * ;* * ;*  * ;* WHERE: CCCC IS FOUR-DIGIT AUTHORIZATION CODE * ;* NNN IS A 1-3-DIGIT TASK NUMBER * ;* HH IS TWO-DIGIT HOUR * TIME * ;* MM IS TWO-DIGIT MINUTE * TIME * ;* MM IS TWO-DIGIT MONTH * DATE * ;* DD IS TWO-DIGIT DAY * DATE * ;* SZ,$MXOBJ,$PS001 THRU $PS016,PRIP01 THRU PRIP16 ; $RLDNO,PRIBKG .PAGE ; THE FOLLOWING DEFINE MEANINGS OF BITS IN LOWER "FLAG BYTE": DBLDEF = 4 ;SINGLE/MULTIPLE DEFINITION (0/1) UNDEF = 10 ;UNDEFINED/DEFINED (0/1) ABSREL = 40 ;ABSOLUTE/RELATIVE (0/1) INTGLB = 100 ;INTERNAL/GLOBAL TXTCMD = 3 ;COMMAND TO BEGIN A TEXT BLOCK RLDCMD = 4 ;COMMAND FOR " RLD CRINIT .ENDC .IFNZ $DTAPE .REF DTINT .ENDC ; .CSECT .IFZ OVRLAY SSTACK = . ; BEGIN SYSTEM STACK HERE FOR ROS I .ENDC PSR = 177776 ; PROCESSOR STATUS REGISTER EQUATE PSBENB = 165400 ; DEVICE ADDRESS AT WHICH TO ENABLE ; ; MANUAL PUSHBUTTON ; ; INTERRUPT VECTOR EQUATES ; MPSHBT = 244 ; MANUAL PUSHBUTTO! MOV #LIST,-(SP) * ;* EMT DELETE * ;* * ;* OR THE FORTRAN EQUIVALENT: * ;* * ;* CALL DELETE(LIST) * ;* * ;* " YY IS TWO-DIGIT YEAR * DATE * ;* YYY IS A 1-3 DIGIT LOGICAL DEVICE NO. * ;* * ;* END OF MESSAGE WILL BE A CARRIAGE RETURN. * ;* * ;* PROGRAM USAGE. INPUT WILL BE CONSTRUCTED SUCH THAT * ;* IF IN A DISC SYSTEM, IT WILL BE AN OVERLAY * ;* TASK W#" BLOCK MODEND = 6 ;MODULE END COMMAND PCMD1 = 7 ;RLD COMMAND TO SET PC PCMD2 = 10 ;RLD COMMAND TO BUMP CURRENT PC ; FOLLOWING ARE ENTRY-TYPE COMMANDS: OBJMN = 0 ;OBJECT MODULE NAME SECTN = 1 ;SECTION NAME GENTRY = 4 ;GLOBAL ENTRY POINT DECLARATION ; FOLLOWING ARE OFFSET VALUES FOR WORDS WITHIN ENTRIES FLAGS = 4 ;DESCRIPTOR FLAGS $N MPSHLV = 200 ; BR4 FOR MANUAL PUSHBUTTON .IFZ $SAVE-3 ; ONLY IF REAL SAVE (BPT TRAP) SAVTRP = 14 ; SAVE TRAP .ENDC .IFZ $SAVE-104400 ; ONLY IF ODT SAVE (TRAP TRAP) SAVTRP = 34 .ENDC SAVLEV = 340 ; SAVE UNDER LOCKOUT .CSECT SYSBLD ; FOR MOD. TO WRITE TO DDC DISK ******** .CSECT .ALINT ; PICK UP ASYNC'S INIT ROUTINE. ******** % THE LINKAGE TO SUBROUTINE PRTCT IS: * ;* * ;* MOV #LIST,-(SP) * ;* EMT PRTCT * ;* * ;* OR THE FORTRAN EQUIVALENT: * ;* *&ITH SEGMENTS. INPUT IS PLACED IN THE ROS * ;* SOFTWARE TASK QUEUE WHENEVER A "REQUEST" INTERRUPT * ;* OCCURS. IF WHILE WAITING FOR INPUT, TTY MAX SECONDS * ;* HAVE ELAPSED, INPUT WILL BE ABORTED. IT WILL BE NECESSARY * ;* FOR THE OPERATOR TO REQUEST AGAIN. * ;* * ;* PROGRAMMER 54 * ;* ' VALR = 6 ;SYMBOL'S RELATIVE VALUE BASE = 8. ;SECTION'S BASE (OFFSET FROM LOAD BASE) VALF = 8. ;SYMBOL'S FINAL VALUE (OFFSET FROM LOAD BASE) ; FOLLOWING ARE EMT INDICES FOR THE "BFUP" ROUTINES BFINIT = 36 BFENTR = 37 BFOPEN = 40 BFCLOS = 41 ; FOLLOWING ARE MISCELLANEOUS DEFINITIONS BTCHID = $BCHID ;BATCH FILE I.D. BPSYM = 10. ;NUMBER OF BYTES PER SYMBOL EN( .CSECT .CRINT .CSECT .LPINT .CSECT .SYSIN .CSECT .DYSIN .CSECT .QUEUE .CSECT .EMTIN .CSECT .CLINT .CSECT .TTYIN .CSECT .MAIN. ; START OF CODE. MUST BE AFTER OTHER NAMED ; IPL = . RESET ; SEND INIT PULSE TO ALL DEVICES MOV #340,PSR ; SET CPU LEVEL TO 7 DURING IPL MOV #SSTACK,SP ; SET UP SYSTEM STACK .IFZ $SAVE-104400) ;* CALL PRTCT(LIST) * ;* * ;* THE LINKAGE TO SUBROUTINE UNPRCT IS: * ;* * ;* MOV #LIST,-(SP) * ;* EMT UNPRCT * ;* * DATE * ;* REVISION * ;* * ;*********************************************************************** .DEF INPUT,OPCOMR,ER3MSG,DATADR,TTYLST,INPTHD .DEF TTRLST .REF ENABLE,DSABLE,QTASK .REF TABORT,TIME,DATE .REF IOSTAT,TPRTY,HEADER .REF RESET,TSTAT +TRY GSDMAX = 4 ;MAX GSD COMMAND ALLOWED HT = 11 ;HORIZONTAL TAB LF = 12 ;LINE FEED FF = 14 ;FORM FEED CR = 15 ;CARRIAGE RETURN EXIT = 4 ;EMT FOR CALL TO MONITOR EXIT TTYOUT = 13 ;EMT FOR CALL TO TELETYPE OUTPUT TTYIN = 14 ;EMT FOR TELETYPE INPUT BINASC = 16 ;EMT FOR BINARY-TO-ASCII DISCIO = , MOV 14,-(SP) MOV 16,-(SP) .ENDC JSR PC,PSTIPL ; TRAP INIT. ; ******** MOV #0600,@#177774 ; SEY KERNAL STACK LIMIT REGISTER ******** ; ******** .IFZ $SAVE-104400 MOV (SP)+,16 MOV (SP)+,14 .ENDC JSR PC,PFSIPL ; FOWER FAIL INIT.- * ;* OR THE FORTRAN EQUIVALENT: * ;* * ;* CALL UNPRCT(LIST) * ;* * ;* WHERE IN ALL CASES, LIST IS THE FILE MANAGEMENT * ;* REQUEST LIST. THIS LIST IS CONSTRUCTED AS FOLLOWS: * ;* . .REF IFD ; ******** TTYOUT = 13 TTYIN = 14 ASCBIN = 17 EXIT = 4 NOCKPT = 30 QUEUE = 1 ; .CSECT ; NSIZE = 50. ; TASK STACK SIZE ; ; MXCHIN = 24. ; MAXIMUM NO. CHAR. DURING INPUT .PAGE ; ; THE FOLLOWING LIST IS THE TASK HEADER FOR INPUT ; INPTHD = . .WORD 1. ; THREAD WORD .WORD / 23 ;EMT FOR DISC I/O ROUTINE LPRNTR = 25 ;EMT FOR LINE PRINTER NOCKPT = 30 ;EMT FOR NO CHECKPOINT ROUTINE GETIME = 31 ;EMT FOR GET TIME GEDATE = 32 ;EMT FOR GET DATE R50PAK = 46 ;EMT FOR RADIX-50 PACK ROUTINE R50UNP = 47 ;EMT FOR RADIX-50 UNPACK DEFINE = 51 ;EMT FOR "DEFINE FILE" DELETE = 52 ;EMT FOR "DELETE FILE" CORL0 ; ; SET UP INTERRUPT AND TRAP VECTORS ; MOV #RQUEST,MPSHBT ; SET UP HANDLER FOR MANUAL PUSHBUTTON MOV #MPSHLV,MPSHBT+2 MOV #SAVE,SAVTRP ; SET UP SAVE TRAP HANDLER MOV #SAVLEV,SAVTRP+2 .IFGE NTTYS-1 MOV #200,R1 ;INIT INTERRUPT VECTORS FOR MOV #KBDINT,60 ;TTY UNIT 0 MOV R1,62 MOV #PRTINT,64 MOV R1,66 .ENDC .IFGE NTTYS-2 1 * ;* WORD 0: THREAD - THREAD WORD. NOMINALLY = 1 * ;* WORD 1, BYTE 0: ERROR - CONTAINS ERROR STATUS * ;* ON RETURN FROM FLMGMT. * ;* , BYTE 1: ERRTSK - TASK NO. TO QUEUE IF * ;* AN ERROR OCCURS. 0= NONE. * ;* WORD 2: RESERVED FOR SYSTEM USE * ;* WORD 3: FILEID - FILE'S 2INPUT ; ENTRY POINT .WORD 0 ; NO INITIALIZATION ENTRY .WORD 0 ; NO MAX. EXECUTION TIME .BYTE NSIZE ; TASK STACK SIZE .BYTE 1 ; PRIORITY 1-HIGHEST .WORD 0 ; CURRENT TIMER VALUE .IFNZ ARG .WORD 0 ; TRANSMITTED ARGUMENT .ENDC .BYTE 5 ; CENTRAL PROCESSOR STATUS REG.-FILE TYPE .BYTE $INPNO ; 3OD = 56 ;EMT TO GET ADDR OF MONTOR REF TABLE STSIZE = 100. ;STACK SIZE (WORDS) PHDSZE = 15. ;"PROGRAM HEADER SIZE": # OF WORDS LEDWDS = 3 ;# WDS INSERTED IN FRONT OF PROGRAM BY LOADER LDBYTS = LEDWDS*2 ;(# BYTES INSERTED) .PAGE ;FOLLOWING ARE INDEX VALUES TO THE TASK HEADER HMAXEQ = 6 ;TASK MAX EXECUTION TIME WORD HPRIOR = 9. ;TASK PRIORITY WORD HSTATS = 4 INC R1 ;INIT INTERRUPT VECTORS FOR MOV #KBDINT,340 ;TTY UNIT 1 MOV R1,342 MOV #PRTINT,344 MOV R1,346 .ENDC .IFG NTTYS-2 XXXXXX ;CREATE ASSY ERROR IF NTTYS .GT. 2 .ENDC .IFNZ NDISCS .IFZ $DDSDC ; ONLY FOR RF-11 DISK MOV #DINT,204 ; SET UP FOR DISC 0 MOV #240,206 ; AT INTERRUPT LEVEL 5 .END5ID ON WHICH TO PERFORM * ;* FILE MANAGEMENT. * ;* WORD 4, BITS 0-6: FILE TYPE - OF WHICH FILE TYPE * ;* DOES SUBJECT FILE BELONG. 0 THRU 127. * ;* ,BIT 7: C-STATUS, REQUIRED BY 'DEFINE' ONLY. * ;* 1=MAKE ENTRY INTO CORE DIRECTORY. * ;* 0= ENTRY INTO DISC DIRECTORY ONLY. * ;* ,BYTE 1: RESERVED6TASK NO. .WORD 0 ; SAVED VALUE OF STACK POINTER TSTACK = . .WORD 203 ; FILE ID .WORD 0,0,0,0,0,0,0,0,0,0 ; .WORD 0,0,0,0,0,0,0,0,0,0 ; WORDS FOR TASK STACK .WORD 0,0,0,0,0,0,0,0,0,0 ; .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 . = TSTACK+NSIZE+NSIZE ; DELETE THOSE NOT NEEDED ; ; 7 ARG*2+14 ;HEADER STATUS BYTE HTASK = HSTATS+1 ;HEADER TASK NUMBER BYTE HSTACK = HTASK+1 ;TASK STACK WORD ; PROGRAM HEADER LODHED: ;HEADER FOR "ROSLOD" .WORD 1 ;T/W .WORD LODA00 ;BEGIN OF LOADER .WORD 0 ;INIT .WORD 0 ;MAX XEQ .BYTE STSIZE ;STACK SIZE (WORDS) .BYTE PRIBKG ;PRIORITY .WORD 0 HC .IFNZ $DDSDC ; ONLY FOR DDS DISK MOV #DINT,@#130 ; DISK 0 AT LEVEL 5. VECTOR IS 130. ******** MOV #240,@#132 ; ******** .ENDC .ENDC .IFNZ $DTAPE MOV #DTINT,214 ; SET UP VECTOR FOR MOV #300,216 ; THE DECTAPE .ENDC ; ******** ; ONLY FOR MAGTAPES IN CITE FOR SYSTEM USE. * ;* WORD 5: LENGTH - REQUIRED BY 'DEFINE' ONLY. * ;* LENGTH,IN SECTORS, OF FILE TO BE * ;* DEFINED. NOTE: IF LENGTH=0,THEN * ;* DEFINE WILL ALLOCATE LARGEST * ;* AVAILABLE AREA IN FILE TYPE AREA * ;* TO FILE. THIS WORD WILL CONTAIN * ;* F THE FOLLOWING IS USED FOR ASCII TO BINARY CONVERSIONS ; ASCII = . .BYTE 0,0,0,0,0,0 ; ASCII STRING STORAGE ; RCFLG: .WORD 0 ; RESET/COMPRESS FLAG ; ; 0=RESET ; ; 1=CMPRS ; .IFNZ $BATCH ; ; BFUP COMMUNICATIONS BLOCK ; BFBLCK = . .WORD 0 ; ERROR WORD .WORD $BCHID ; BATCH FILE ID .WORD 0,0 G ;TIMER .WORD 0 ;ARG .BYTE $OVTYP ;STATUS (INIT W/ FILE TYPE .BYTE $RLDNO ;TASK NUMBER .WORD 0 ;STACK .WORD 201 ;INIT BOTTOM OF STACK W/FILE I.D. .=STSIZE*2+.-2 .PAGE ;FIRST PRINT IDENTIFICATION ON TTY TO OPEN DIALOGUE: LODA00: ;TASK BEGIN FOR THE LOADER EMT NOCKPT ;SET TASK NON-CHECKPOINTABLE MOV #$BCHID,BFBLK1+2 ;INIT BATCH""""""" """"""""""""""""""""""""""DDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDAA@D""""""""""""""""""""""""""""33333333DDDDDDDDDDDDDDDDDDDADDB Cm'- g:` Cr\M =:ȓ vt! r=u~#" 8;  z :   ;}8E4d $%$Da ͋,L w:B8 ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * B.&0 M &0 & ILENGTH OF FILE JUST DEFINED. * ;* IF THE CALL IS TO DEFINE, WORD 2 WILL CONTAIN THE IFD * ;* OF THE FILE (CORE ENTRY ONLY) ENTRY JUST DEFINED UPON * ;* RETURN. * ;* UPON RETURN, THE VALUE OF ERROR WILL CONTAIN ONE OF THE * ;* FOLLOWING: * ;* 0 = REQUEST PROCESSED SUCCESSFULLY * ;* 1 = LISTJ ; ELEMENT NAME .WORD 1 ; FORCE INIT. .WORD 0,0 ; NOT USED BY BFINIT ; .ENDC .PAGE ; ; THE FOLLOWING CONTROL SECTION CONTAINS THE TABLES AND ; MESSAGES FOR INPUT I/O. THIS WILL BE CORE-RESIDENT IN ; A CORE OR OVERLAY SYSTEM SUCH THAT INPUT MAY BE ; CHECKPOINTED DURING TTY I/O. ; .CSECT RES ; ; THE FOLLOWING LIST IS THE I/O PARAMETER LIST USED FOR ; TTY I/O ; TTYLST = K I.D. FILE MOV #$BCHID,TXTHED ;INIT IN CASE RE-RUN MOV #400,BFSTAT ;SET TO "TYPE" = LOAD MODULE MOV #LODNAM,-(SP) ;WILL CONVERT ASCII OF LOAD ELEMENT NAME MOV #BFNAME,-(SP) ;TO RAD50 FOR "BFUP" CALL EMT R50PAK MOV #BFBLK1,-(SP) EMT BFCLOS ;CLOSE IN CASE IT WAS LEFT OPEN MOV #IDMSG,TTYBUF ;INIT FOR INITIAL I.D. MESSAGE MOV #TTYLST,-(SP) EMT TTYOUT LGO. ******** ; ******** MOV #MTINT,@#104 ; SET UP MAGTAPE INTERRUPT VECTOR. ******** MOV #240,@#106 ; ******** ; ; ******** JSR PC,ASYNCI ; INITALIZE THE ASYNC HANDLER FOR CITGO.******** ; M NOT THREADABLE * ;* 2 = FILE ID NOT VALID * ;* 3 = FILE TYPE NOT VALID * ;* 4 = PHYSICAL UNIT ON WHICH FILE TYPE RESIDES * ;* NOT VALID. * ;* 5 = FLMGMT NOT CALLED BY A TASK * ;* 6 = NO AVAILABLE SPACE IN CORE RESIDENT DIRECTORY * ;* N. .WORD 1 ; THREAD WORD .BYTE SYSTTY ; LOGICAL DEVICE .BYTE 2 ; USE EXIT TYPE #2 -ALL TTY I/O .WORD 0 ; NO I/O COMPLETE ROUTINE .BYTE 0 ; NO ERROR TASK NO. .BYTE 1 ; USE TTY PRIORITY QUEUES INERR: .WORD 0 ; FOR SYSTEM USE - SYSTEM .WORD 0 ; FOR SYSTEM USE - SYSTM2 DATADR: .WORD 0 ; WILL CONTAIN ADDRESS OO ;PRINT ON TTY ; NOW INPUT COMMAND STRING MOV #ASCDAT,TTYBUF ;INIT FOR INPUT OF COMMAND STRING MOV #TTYLST,-(SP) EMT TTYIN ;INPUT ENTIRE COMMAND STRING MOV #ASCDAT+4-1,R0 ;INIT POINTER TO NAMES BUFFER MOV #NAMBUF,R1 ;FILL W/RAD50 FORMS OF MODULE NAMES MOV INPCNT,R2 ;ACTUAL # OF CHARS RECEIVED BNE LODA10 EMT EXIT ;MUST TYPE AT LEAST ONE CHAR .PAGE P ******** ; XFER TO OTHER INITIALIZATION SUBROUTINES ; JSR PC,EMTINIT ; FILL UNDEFINED EMT REFS WITH ERROR RETURN JSR PC,TTINIT ;INITIALIZE TTYIO TABLES JSR PC,CLINIT ;INIT FOR CLOCK ROUTINES .IFNZ OVRLAY JSR PC,DYSINI ; INIT. DYNAMIC STORAGE ALLOCATOR .ENDC .IFG NLP ; ONLY IF HAVE LP JSR PC,LPINIT .ENDC .IFG Q FOR NEW ENTRY * ;* 7 = FILE ALREADY DEFINED (DEFINE) * ;* 8 = CANNOT FIND ENOUGH DISC SPACE TO DEFINE FILE * ;* WITH LENGTH REQUESTED. * ;* 9 = FILE NOT DEFINED(DELETE,PRTCT,UNPRCT) * ;* . * ;* . * ;* RF DATA BUFFER ; ; INPUT TTY INPUT BUFFER ; INBUF = . .WORD MXCHIN ; MAXIMUM INPUT RESPONSE NOCHAR: .WORD 0 ; USED BY TTYIN BUFST = . ; MESSAGE STARTS HERE .BYTE 0,0,0,0,0,0,0,0,0,0 ; ADD .BYTE 0,0,0,0,0,0,0,0,0,0 ; MORE .BYTE 0,0,0,0,0,0,0,0,0,0 ; IF .BYTE 0,0,0,0,0,0,0,0,0,0 ; GREATER .BYTE 0,0,0,0,0,0,0,0,0,0 ; THAN 50 REQUIRED . = SLODA10: MOV #TMPBUF+6,R3 ;POINTER TO TMPY BFR FOR CONVERSION MOV #" ,-(R3) ;CLEAR BFR W/ BLANKS MOV #" ,-(R3) MOV #" ,-(R3) LODA20: INC R0 ;BUMP LIST POINTER TO NEXT CHAR DEC R2 ;ANY MORE CHARS? BLT LODA30 ;NO: GO TO FINAL CONVERSION OR TO EXIT CMPB (R0),#', ;COMMA ENDS FIELD BEQ LODA30 ;END OF FIELD CMP R3,#TMPBUF+5 ;TMP BUF FTNCR ; ONLY IF HAVE CARD READER JSR PC,CRINIT .ENDC .IFNZ NDISCS .REF AUFCN,AULIST,DISCIO,INIDSC .REF CDIFCN,CDILST .REF TASKS,$TKFLS,$TKFLF CLR PSR ; RESET LOCKOUT SO DISC INTERRUPT ; ; MAY BE RECEIVED CLRB AUFCN ; SET TO READ ALLOCATION FILE TYPE DIR. MOV #AULIST,-(SP) JSR PC,DISCIO ; READ FILE TYPE DIRU . * ;* 15 = DISC READ OR WRITE ERROR OCCURRED * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* * V BUFST+MXCHIN ; DELETE THOSE NOT NEEDED .EVEN ; ; THE FOLLOWING LIST IS THE I/O LIST FOR THE READY MESSAGE ; PRINTOUT WITH AN EXIT TYPE ONE SO AN EXIT TYPE 2 REQUEST ; CAN BE MADE IMMEDIATELY AFTERWARDS.***UNTIL WE CAN ; COMMAND CHAIN LISTS ON TTY. ; TTRLST = . .WORD 1 ; THREAD WORD .BYTE SYSTTY ; LOGICAL DEVICE .BYTE 1 ; USE EXIT TYPE 1 .WORD 0 ; NO I/OWULL? (ONLY 1ST SIX CHARS USED) BHI LODA20 ;FULL: IGNORE REST OF CHARS TO COMMA MOVB (R0),(R3)+ ;XFER CHAR TO TMP BUF BR LODA20 .PAGE LODA30: MOV #TMPBUF,-(SP) MOV R1,-(SP) EMT R50PAK ;CONVERT TO RADIX-50 MOV (R1)+,R3 ;CHECK CONVERTED NAME... BIS (R1)+,R3 ;...FOR ALL NULLS BEQ LODB10 ;ALL NULLS: END OF INPUT LINE REACHED LODA40: CMP XECTORY IPLX20: CMP #1.,AULIST ; I/O COMPLETE? BNE IPLX20 ; NO-KEEP CHECKING MOVB #1.,AUFCN ; PUT BACK FCN AS WRITE IN LIST CLRB CDIFCN ; SET TO READ CORE DIRECTORY IMAGE MOV #CDILST,-(SP) JSR PC,DISCIO ; READ CORE DIRECTORY IMAGE INTO CORE DIR. IPLX30: CMP #1.,CDILST ; I/O COMPLETE? BNE IPLX30 ; NO-KEEP CHECKING MOVB #1.,CDIFCN ; RESET FCN IN LIST BACKY;*********************************************************************** ; .DEF FMFRST,FMLAST,FSTAT,DEFINE,DELETE,PRTCT,UNPRCT .DEF FNEXT,FLAST,AULIST,AUFCN,INIDSC,FLMB00 .DEF CDILST,CMPTMR,FINIT,CDSRCH,NOFMRQ,FMACTV .REF PUSHR,POPR,PHYDEV,ACTIVE,$CTASK,IOSTAT,QSAVEI .REF DSPTCH,CPRSIP,DISCIO,PFRITE,UNSPND,RELTSK,DOD .REF QUEUE,MASK,LOGMAX,TTYOUT,EXIT,CDIHDR,CDEND,FILE,HEADER .PAGE ; .CSECT FMTBLS ; ; Z COMPLETE REOUTINE .BYTE 0 ; NO ERROR TASK NUMBER .BYTE 1 ; USE TTY PRIORITY QUEUES .WORD 0 ; SYSTEM .WORD 0 ; SYSTM2 .WORD RDYMSG ; READY MESSAGE '? ' ; ; AUTHORIZATION CODE REQUEST MESSAGE ; ACMSG = . .WORD 5. .WORD 0 .BYTE 15 .ASCII /AC:/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; ; READY RE[(R1)+,(R1)+ ;LEAVE ROOM FOR FOUR WORDS PER ENTRY BR LODA10 ;...AND GO TO FETCH ANOTHER NAME ; ******************************************************************** ;"NAMBUF" STRUCTURE: NAME/NAME/START SECTOR/# OF SECTORS LODB10: ;ALL NAMES NOW CONVERTED TO RAD50 MOV #NAMBUF,R0 ;INIT POINTER TO LIST OF RAD50 NAMES SUB #NAMBUF+4,R1 ;#BYTES IN CONVERTED LIST ASR R1 ;#WORDS ASR R1 AS\ TO WRITE CLRB $TKFLF ; SET UP TO READ TASK TABLE MOV #$TKFLS,-(SP) JSR PC,DISCIO ; READ TASK TABLE IPLX40: CMP #1.,$TKFLS ; I/O COMPLETE? BNE IPLX40 MOVB #1,$TKFLF ; SET FUNCTION TO A WRITE FOR OTHERS ******** JSR PC,SYSINI ; INIT. CORE TASKS ; ; SET UP INIDSC IN TASK TABLE MOV #$INITD,R0 ; TASK NUMBER MOVB #1,TPRTY(R0) ; RUN AT PRIORITY 1 ] THE FOLLOWING IS USED TO THREAD FILE MANAGEMENT REQUESTS FMFRST = . .WORD 0 ; THREAD FIRST POINTER FMLAST = . .WORD FMFRST ; THREAD LAST POINTER NOFMRQ = . .WORD 0 ; NO. FILE MGMT. REQUESTS IN QUEUE ; ; THE FOLLOWING LIST IS USED TO UPDATE THE FILE TYPE ; ALLOCATION DIRECTORY. ; AULIST = . .WORD 1 ; THREAD WORD .BYTE 1 ; LOG. DEV^SPONSE ; RDYMSG = . .WORD 3. .WORD 0 .BYTE 15 .ASCII /? / ; ? SPACE .EVEN ; ; ILLEGAL COMMAND ERROR MESSAGE ; ER1MSG = . .WORD 9. .WORD 0 .ASCII /ILL CMD!/ .BYTE 15 .EVEN ; ; ILLEGAL PARAMETER ERROR MESSAGE ; ER2MSG = . .WORD 9. .WORD 0 .ASCII /ILL PAR!/ .BYTE 15 .EVEN ; ; CANNOT PERFORM FCN_R R1 ;#NAMES CONVERTEDTO RADIX-50 MOV R1,MODCNT ;SAVE IT: # OBJ MODULES TO LINK .PAGE CLR BFSTAT ;STATUS AND TYPE: FREE AND OBJECT MODULE LODB20: DEC R1 ;# NAMES BLT LODC10 ;GOOD EXIT: ALL DONE MOV (R0)+,BFNAME ;LOAD LIST WITH NEXT REQUESTED NAME MOV (R0)+,BFNAME+2 MOV #BFBLK1,-(SP) EMT BFOPEN ;LOOK FOR MODULE AND OPEN IT TS` ASL R0 MOV #INIDSC,HEADER(R0) ; TASK'S HEADER ADDRESS CMP #$INITD,TASKS BLE IPLX60 MOV #$INITD,TASKS IPLX60 = . .ENDC MOV #CALIST,-(SP) ; PRINT ROS CALL LINE ON SYSTEM TTY. ******** JSR PC,TTYOUT ; ******** IPLY10: CMP CALIST,#1 ; WAIT ON EXIT TYPE 1 ******** BNE IPLY10 ; aICE 1 .BYTE 1 ; EXIT TYPE 1 .WORD 0 ; NO I/O COMPLETE .BYTE 0 ; NO ERROR TASK .BYTE UDLEV ; HIGH PRIORITY UPDATE .WORD 0 ; DISC ERROR WORD .WORD 0 ; SYSTEM USE .WORD .+2 ; BUFFER STARTS AT NEXT LOCATION ; .WORD NDISCS+2 ; ID FOR FTDIR .BYTE 1 ; WRITE COMPLETE FILE AUFCN: .BYTE 1 b BECAUSE TASK Q'ED OR ACTIVE ; ER3MSG = . .WORD 14. .WORD 0 .ASCII /NON-QUIESCENT/ .BYTE 15 .EVEN ; .CSECT .PAGE .IFZ $DEBUG ; ; AUTHORIZATION CODE TABLE ; ; ; AUTHORIZATION CODE ASSIGNMENTS ; AC0000 = 436. ; CITGO CODE ******** AC0001 = 1. AC0002 = 2. AC0003 = 3. AC0004 = 4. AC0005 = 5. AC0006 = 6. AC00cT BFBLK1 ;WAS IT THERE? BNE LDER11 ;NOT FOUND: ABORT MOV BFSECT,(R0)+ ;FILL LOADER'S LIST WITH SECTOR INFO MOV BFSIZE,(R0)+ BR LODB20 .PAGE LDER11: MOV #11,R4 ;"BFUP" DIRECTORY SEARCH FAILURE JSR PC,ERRPRT ; ******************************************************************** LODC10: ; ALL NAMES FOUND IN DIRECTORY. NOW PROCEED WITH PASS 1. MOV #NAMBUF,NAMPTR ;Pd ******** MOV #$INPNO,-(SP) ; QUEUE INPUT AUTOMATICALLY. ******** CLR -(SP) ; DEFAULT PRIORTY ******** CLR -(SP) ; NO PASSED ARGUMENT. ******** CLR -(SP) ; RETURN AT ONCE ******** JSR PC,QUEUE ; ******** TST (SP)+ ; POP OF ERROR WORD e ; WRITE I/O FCN .WORD 0,0,0 ; ; THE FOLLOWING TABLE IS USED TO CONTAIN THE NEXT AND LAST ; POINTERS FOR EACH FILE TYPE. THEY WILL BE INITIALIZED DURING ; ROS IPL. ; FNEXT = . . = .+$FTMAX+$FTMAX FLAST = . . = .+$FTMAX+$FTMAX ; RESERVE $FTMAX WORDS FINIT = . . = .+$FTMAX+$FTMAX ; RESERVE $FTMAX WORDS . = $FTDRL*64.*2+FNEXT ; RESERVE A MULTIPLE OF 64 WORDS ; ; THE FOf07 = 7. AC0008 = 8. AC0009 = 9. AC0010 = 10. AC0011 = 11. AC0012 = 12. AC0013 = 13. AC0014 = 14. AC0015 = 15. AC0016 = 16. AC0017 = 17. AC0018 = 18. AC0019 = 19. AC0020 = 20. ; ; EXPAND IF MORE THAN 20 ASSIGNMENTS ; AUTCOD = . .WORD AC0000 .WORD AC0001 .WORD AC0002 .WORD AC0003 .WORD AC0004 .WORD AC0005 .WgOINTER TO LIST OF MODULE NAMES MOV MODCNT,NAMCTR ;# OF MODULES IN LIST MOV #LSDBGN,SYME ;INIT PTR TO DEFINED SYMBOLS MOV #LSDBGN,USYME ;INIT PTR TO UNDEFINED SYMBOLS .PAGE LODC20: ;LOOP HERE FOR SUCCESSIVE OBJECT MODULES JSR PC,NXTMOD ;INIT FOR NEXT OBJ MODULE BR LODC19 ;DONE WITH ALL OBJ MODULES LODC30: JSR PC,NXTBLK ;GET NEXT BLOCK BR LODC19 ;DONE WITH ALL OBJECh******** CLR R0 CLR R1 CLR R2 CLR R3 CLR R4 CLR R5 MOVB #200,PSBENB ; ENABLE MANUAL PUSHBUTTON INTERRUPT JMP DSPTCH ; FINISHED WITH IPL-EXECUTE ROS ; ******** ; TTY LIST FOR ROS CALL LINE. ******** CALIST: .WORD 1 ; THREAD WORD ********iLLOWING IS THE COMPRESS TIMER MODULE. IT IS ; LOCATED HERE SO COMPRS CAN BE CHECKPOINTED DURING ; ITS SUSPENSION DUE TO TIME-OUT. ; CMPTMR = . .WORD 1 ; THREAD WORD .BYTE $CPTNO ; TASK NO. OF COMPRS .BYTE 200+MSECR ; SUSPEND/MILLISECOND RESOLUTION .WORD 100. ; 100 MILLISECOND TIMER ; ; .PAGE ; ; LIST TO UPDATE THE CORE DIRECTORY IMAGE ON DISC ; CDILST = . jORD AC0006 .WORD AC0007 .WORD AC0008 .WORD AC0009 .WORD AC0010 .WORD AC0011 .WORD AC0012 .WORD AC0013 .WORD AC0014 .WORD AC0015 .WORD AC0016 .WORD AC0017 .WORD AC0018 .WORD AC0019 .WORD AC0020 ; .= AUTCOD+ACTSIZ+ACTSIZ ; USE ONLY AMOUNT NEEDED .WORD -1. ; END OF TABLE .ENDC .PAGE ; ; OPERATORkT BLOCKS LODD00: ;HERE TO PROCESS SUCCESSIVE GSD BLOCKS ; R0 POINTS TO FIRST DATA BYTE IN BLOCK ; R5 CONTAINS BYTE COUNT OF DATA BYTES TST BLOCK1 ;IS THIS FIRST BLOCK IN MODULE? BEQ LODD10 ;YES DEC (R0) ;IS THIS A GSD BLOCK? BEQ LODD15 ;YES: PROCEED DEC (R0) ;IS IT GSD END? BEQ LODC20 ;YES: GET NEXT OBJ MODULE CMP (R0),#4 l .BYTE SYSTTY ; USE SYSTEM TTY. ******** .BYTE 1 ; EXIT TYPE ******** .WORD 0 ; NO I/O COMPLETE ******** .BYTE 0 ; NO ERROR TASK. ******** .BYTE 1 ; PRIORTY OUTPUT ******** .WORD 0,0 ; ******** .WORD m .WORD 1 ; THREAD WORD .BYTE 1 ; LOG DEVICE 1 .BYTE 1 ; EXIT TYPE 1 .WORD 0 ; NO I/O COMPLETE .BYTE 0 ; NO ERROR TASK .BYTE UDLEV ; I/O PRIORITY LEVEL 1 .WORD 0 ; DISC ERROR WORD .WORD 0 ; SYSTEM USE .WORD CDIHDR ; ADDRESS OF CORE DIRECTORY IMAGE ; ; BUFFn COMMAND TABLE - EITHER CONTAINS ADDRESSES OF ; COMMAND PROCESSORS OR SEGMENT NUMBERS DEPENDING ON ; WHETHER OR NOT INPUT IS AN OVERLAY TASK ; .MACRO GENENT MNE,ADD ; GENERATE AN ENTRY IN THE OPCOMM TABLE.2/6/73 .ASCII /MNE/ ; 2/6/73 .WORD ADD ; 2/6/73 .ENDM GENENT ; 2/6/73 OPCOMM = . .ASCo ;IS IT MODULE END? BEQ LODC20 ;YES: GET NEXT MODULE BR LODC30 ;NO: GET NEXT BLOCK LODD10: INC BLOCK1 ;INDICATE FIRST BLOCK PROCESSED DEC (R0) ;CHECK THAT IT IS GSD BNE LDER13 ;NOT GSD BEGIN TSTB FLAGS+3(R0) ;FIRST ENTRY'S TYPE BNE LDER14 ;FIRST ENTRY NOT MODULE NAME LODD15: CMP -(R5),(R0)+ ;BUMP BC & PTR PAST GSD COMMAND LODD20: ;HpCALINE ; ADDRESS OF BUFFER ******** CALINE: .WORD 2$-1$ ; NUMBER OF CHARACTERS IN BUFFER ******** .WORD 0 ; RESERVED ******** 1$: .ASCII <15><12> ; ******** .ASCII /ROS II-CITGO GENERATION / ; ******** .ASCII /V02A/ ; ******** .ASCII <15><12> ; qER HEADER ; .PAGE ; ; FILE STATUS INFORMATION IS CONTAINED IN THE FOLLOWING ; TABLE ; FSTAT = . .BYTE $FD000 .BYTE $FD001 .BYTE $FD002 .BYTE $FD003 .BYTE $FD004 .BYTE $FD005 .BYTE $FD006 .BYTE $FD007 .BYTE $FD008 .BYTE $FD009 .IFL 10.-$FTMAX XXXXXXXX ; ONLY SET UP FOR 10 FILE TYPES .ENDC . = FSTAtII /EN/ .WORD ENABLE ; ADDRESS OF ENABLE .ASCII /DS/ .WORD DSABLE ; ADDRESS OF DSABLE .ASCII /QU/ .WORD QTASK ; ADDRESS OF QTASK .ASCII /XX/ .WORD TABORT ; ADDRESS OF TABORT .ASCII /XT/ ; DELETE A TASK ******** .WORD DELTSK ; ******** .IFZ $DEBUG ; ONLY IF HAVE AUTH. CODES sERE FOR EACH SUCCESSIVE ENTRY UNTIL BLOCK END SUB #8.,R5 ;BLOCK END? BLT LODC30 ;YES: GO GET NEXT ONE MOVB FLAGS+1(R0),R2 ;ENTRY TYPE CMPB R2,#GSDMAX ;IS IT LEGAL? BGT LDER15 ;NO MOV R0,R1 ;ENTRY POINTER ADD #8.,R0 ;NEXT ENTRY MOV R1,R4 ;SECONDARY POINTER USED BY VARIOUS RTNES ASL R2 ;BYTE INDEX TO WORD INDEX v ******** .EVEN ; ******** 2$: ; ******** ; ; ; ; .IFNZ OVRLAY ENDDYN = . - 2 ; TOP ADDRESS OF DYNAMIC CORE POOL ; SSTACK = 2000 ; SET UPPER STACK LIMIT. (WORD BEFORE) ******** ; .ENDC ; ; DYNSIZ: .WORD ENDDYN-SSTACK ; MAX # BYTES AVAIL. FOR DYN. AREA. ****uT+$FTMAX ; ALLOCATE AREA FOR REST OF FSTAT .EVEN ; ; FILE MANAGEMENT CONTROL INFORMATION TABLE ; FMACTV: .WORD 0 ; FILE MANAGEMENT ACTIVE SWITCH ; TPCALL = . .WORD DEFA00 ; DEFINE PROCESSOR .WORD DELA00 ; DELETE PROCESSOR .WORD PRTA00 ; PROTECT PROCESSOR .WORD UNPA00 ; UNPROTECT PROCESSOR ; CDAVAL: .WORD 0 ; USED TO SAVE ADDRESS OF AVAILABLE ; ; UPDATE 2/21/73 CALEND.C02 ; UPDATE 1/5/73 CALEND.C01 OFF .S45 (CITGO'S JDATE=0) ; UPDATE 6/27/72 ; UPDATE CALEND.S44 06.21.72 ; UPDATE 4/13/72 CALENDAR ;UPDATE: 8-FEB-72 ; ******************************************************************** ; * PROGRAM IDENTIFICATION: "CALENDAR" * ; * DATE & TIME-OF-DAY ROUTINE * ; * w JMP @GSDTAB(R2) .PAGE GSDTAB: .WORD LODE00 ;(0) OBJ MOD NAME .WORD LODE20 ;(1) SECTION NAME .WORD LODD20 ;(2) INTERNAL SYMBOL (IGNORE) .WORD LODD20 ;(3) TRANSFER ADDRESS (IGNORE) .WORD LODE40 ;(4) GLOBAL SYMBOL ; ******************************************************************** LDER13: MOV #13,R4 ;FIRST MODULE BLOCK NOT "GSD" JSR PC,ERRPRT LDER14: MOxTO CHANGE. ******** .ASCII /NC/ ; CANGE THE ACCES CODES ******** .WORD NUCODE ; ******** .ENDC ; ******** .ASCII /TM/ .WORD TIME ; ADDRESS OF TIME .ASCII /DT/ .WORD DATE ; ADDRESS OF DATE .ASCII /RE/ .WORD RESET ; ADDRESS OF RESET .ASCII /TY/ y ; ENTRY IN CORE DIRECTORY CDIFD: .WORD 0 ; USED TO SAVE IFD AVAILABLE CORE ENTRY NEWSS: .WORD 0 ; USED TO SAVE NEW START SECTOR OF FILE SCHIDX: .WORD 0 ; USED TO SAVE INDEX INTO SEARCH BUFFER OF ; ; A DELETED FILE WHOSE REMAINING ; ; LENGTH IS BEING USED TO DEFINE ; ; A NEW FILE. SBUFLN: .WORD 0 ; LENG**** .END {V #14,R4 ;FIRST ENTRY IN GSD NOT OBJ MOD NAME JSR PC,ERRPRT LDER15: MOV #15,R4 ;ILLEGAL GSD ENTRY DECLARATION JSR PC,ERRPRT LODC19: JMP LODF00 ;END OF READING FIRST PASS OVER OBJ MODS .PAGE ;****************PROCESSING FOR INDIVIDUAL G S D ENTRIES************** ; ON ENTRY TO EACH ROUTINE, R1 AND R4 POINT TO CANDIDATE ENTRY ;*******MODULE NAME******** LODE00: JSR PC,SRMODN ;SEARCH FOR MODULE NAME | .WORD TYCRLP .ASCII /CR/ .WORD CRTY .ASCII /LP/ .WORD LPTY .ASCII /CM/ .WORD QCMPRS ; QUEUE COMPRS .ASCII /AS/ .WORD QRASM ; QUEUE ROS ASSEMBLER .ASCII /LD/ .WORD QROSLD ; QUEUE ROSLOD .ASCII /ID/ ; 1/31/73 .WORD QDINIT ; QUEUE DISC INIT. .ASCII /FL/ .WORD QFLST }TH OF BUFFER DURING CORE/DISC ; ; DIRECTORY SEARCH. LNREQ: .WORD 0 ; USED TO SAVE LENGTH REQUIRED FOR ; ; FILE DURING DIRECTORY SEARCH SORTLN: .WORD 0 ; USED TO SORT LARGEST LENGTH OF A DELETED ; ; TYPE IN A DIRECTORY. .IFNZ DRESDI CRRSCT: .WORD 0 ; USED TO SAVE CURRENT REQUESTS RELATIVE ; ; SECT~; UPDATE 10U12/72 ; UPDATE 10/12/72 ASCBIN.C01 ; UPDATE 4/4/72 ASCBIN.S04 ; UPDATE 11/8/71 ASCBIN.S03 ; UPDATE 10/8/71 ASCBIN.S02 ; UPDATE 9/15/71 ASCBIN.S01 .TITLE ASCBIN ;*********************************************************************** ; ; ASCBIN, CATALOG NUMBER ,ASCII ; TO BINARY CONVERSION SUBROUTINE. ; ; THIS SUBROUTINE WILL CONVERT A SIGNED 5 ; INTEGER ASC BR LDER16 ;NOT UNIQUE MOV SYME,PTROBJ ;POINTER TO NEW MODULE NAME IN LSD JSR PC,INSYME ;GO INSERT ENTRY INTO LSD BR LODD20 ; ******************************************************************** LDER16: MOV #16+100000,R4 ;MODULE NAME NOT UNIQUE JSR PC,ERRPRT ;PRINT ERROR AND RETURN BR LODC20 ;IGNORE THIS MODULE AND GET NEXT ONE .PAGE ;*******SECTION NAME******** LO ; QUEUE FILE LIST .ASCII /IT/ ; 1/26/73 .WORD TSKINI ; TASK INIT. .ASCII /UT/ .WORD QUTIL ; QUEUE UTILITY .ASCII /TC/ .WORD QTC ; QUEUE TASK C??? .IFNZ $BATCH .ASCII /BR/ ; BATCH FILE RESET .WORD BFINIT ; BATCH FILE INITIALIZATION .ASCII /XB/ ; OR OF FILE ENTRY CRREAD: .WORD 0 ; CURRENT REQUEST'S ENTRY ADDRESS IN I/O BUFFER LNODOD: .WORD 0 ; USED TO SAVE LENGTH OF DOD DURING ; ; IT'S SEARCH .ENDC .PAGE .IFNZ DRESDI ; ; DISC I/O PARAMETER LIST FOR DIRECTORY READS AND ; UPDATES. ; DLIST = . .WORD 1 ; THREAD WORD DEVNO: .BYTE 0 ; DEVICE NO. -SET DYNAMICALLY DEXIT: .BYTE II DECIMAL STRING STORED IN A ; SIX BYTE ARRAY, SPECIFIED BY THE CALLING ; PROGRAM, TO A SIGNED BINARY INTEGER OF ; 15-BITS AND SIGN(16-BIT COMPUTER WORD). ; A VALIDITY CHECK WILL BE MADE ON EACH ; BYTE TO DETERMINE IF WITHIN THE RANGE ; 0 THRU 9. ; CALLING SEQUENCE: ; ; MOV #STRING,-(SP) ; ; EMT ASCBIN ; MOV (SP)+,INTGR ; TST (SP)+ ; BNE ERROR ; ;DE20: JSR PC,PTGLOB ;SEARCH FOR IT IN LSD BR LODE22 ;NOT FOUND - GO INSERT IT BITB #UNDEF,FLAGS(R1);IS IT DEFINED? BNE LODE24 ;YES -(BYPASS UNDEF WORK) JSR PC,SQUISH ;NO: REMOVE FROM UNDEF AREA LODE22: MOV R1,R4 ;INSERT NEW SECTION NAME INTO LSD MOV SYME,PTSECT ;POINTER TO SECTION NAME IN LSD JSR PC,INSYME ;INSERT NEW NAME IN LSD BR LODD 1/31/73 .WORD DELBCH ; ******** .ENDC .ASCII /PT/ ; REQUEST TO QUEUE THE TASK PATCHER. ******** .WORD QPATCH ; ******** .ASCII /EX/ .WORD 0 ; EXIT FROM INPUT TASK .WORD 0 ; END OF TABLE ; .PAGE ; ; EQUATES FOR ASCII STRING ; ASCIIS = ASCII ; ASCII SIGN POSITI 3 ; USE EXIT TYPE 3 IOCOMP: .WORD 0 ; I/O COMPLETE ADDRESS - SET DYNAMICALLY .BYTE 0 ; NO ERROR TASK DLVL: .BYTE 0 ; DISC PRIORITY LEVEL - SET DYNAMICALLY DERRWD: .WORD 0 ; DISC ERROR WORD .WORD 0 ; RESERVED FOR SYSTEM .WORD DBUF ; ADDRESS OF DISC BUFFER ; DBUF = . .WORD 0 ; USED FOR FILE ID - SET DYNAMICALLY .BYTE ; WHERE: #STRING=ADDRESS OF ASCII BYTE STRING ; INTGR=LOCATION TO PUT BINARY INTEGER ; ; ASCII SPACES OR BINARY ZEROS ARE VALID IN LEADING ; NON-SIGNIFICANT POSITIONS. REGISTERS R0 THRU ; R5 ARE SAVED IN THE STACK AREA (SP) AND RE- ; STORED UPON EXIT. ; ; UPON RETURN IF ERROR WORD, PUSHED ON STACK BY ASCBIN, ; NOT = 0, A CONVERSION ERROR OCCURRED. ; ; ; PROGRAMMER 54 ; DATE ; REVISION ; ;********************20 LODE24: ;SECTION NAME FOUND ALREADY DEFINED IN LSD CMPB FLAGS+1(R4),#SECTN ;IS IT A SECTION NAME,TOO? BNE LDER17 ;NO - DOUBLE DEFINITION ERROR MOV R4,PTSECT ;SECTION NAME POINTER TO ORIG ENTRY CMP VALR(R4),VALR(R1) ;COMPARE SECTION SIZES BHIS LODD20 ;ORIG WAS BIGGER: LEAVE IT MOV VALR(R1),VALR(R4) ;REPLACE WITH NEW BIGGER SIZE BR LODD20 ; ******************ON ASCII1 = ASCII+1. ; 10,000 POSITION ASCII2 = ASCII+2. ; 1,000 POSITION ASCII3 = ASCII+3. ; 100 POSITION ASCII4 = ASCII+4. ; 10 POSITION ASCII5 = ASCII+5. ; DIGIT POSITION .PAGE ; ; IF AN OVERLAY - INPUT MAY BE CHECKPOINTED ; INPUT = . EMT NOCKPT ; SET INPUT NOT CHECKPOINTABLE .IFZ $DEBUG MOV #ACMSG,DATADR ; AUTHORIZATION CODE REQUEST MOV #TT 0 ; USE RLSECT AND NWORD IOFCN: .BYTE 0 ; I/O FCN - SET DYNAMICALLY .WORD 0,0,0 ; RESERVED FOR DISCIO RLSECT: .WORD 0 ; RELATIVE SECTOR-SET DYNAMICALLY .WORD 64. ; ONE SECTORS LENGTH BUFFER = . . = .+128. ; RESERVE 64 WORD BUFFER ; ; .ENDC .PAGE ; ; EQUATES FOR RELATIVE FILE POSITIONS ; SCTR = 2. ; START SECTOR FTYPE *************************************************** .DEF ASCBIN .REF PUSHR,POPR ; .CSECT ; ; ; SPACE=40 ZERO=60 MINUS=55 NINE=9. ; ; ASCBIN = . TST -(SP) ; PUSH 1 MORE WORD ON STACK ******** JSR R5, PUSHR ; SAVE REGISTERS ON STACK MOV 16.(SP),R1 ; ADDRESS OF STRING TO POSITION POINTER MOV 14.(SP),12.(SP) ; SET STACK UP FOR RETURN AND 2 PARA************************************************** LDER17: MOV #17,R4 ;SECTION NAME CONFLICT W/GLOBAL SYMBOL JSR PC,ERRPRT .PAGE ;*******GLOBAL SYMBOL******** (HERE AT LAST...) LODE40: BITB #UNDEF,FLAGS(R1);REF OR DEF? BEQ LODE50 ;REF JSR PC,PTGLOB ;DEF - SEE IF IT IS ALREADY IN LSD BR LODE44 ;NOT FOUND BITB #UNDEF,FLAGS(R4);FOUND: IS IT ALREADY DEFINED? BEQ LODE42 YLST,-(SP) ; I/O LIST ADDRESS TO STACK EMT TTYOUT ; TYPE "AC:" - EXIT TYPE 2 MOV #100004,INBUF ; INPUT FOUR CHARACTER AUTHORIZATION MOV #INBUF,DATADR ; CODE -NO ECHO MOV #TTYLST,-(SP) EMT TTYIN ; GET AUTHORIZATION CODE TST INERR ; ERROR OR TIMEOUT OCCUR? BNE IPTA20 ; YES CMP #4.,NOCHAR ; 4 CHARACTERS INPUT? BNE IPTA20 ; NO-EXIT = 4. ; FILE TYPE PDVCE = 5. ; PROTECT STATUS AND DEVICE LGTH = 6. ; FILE LENGTH CKSAVE = 8. ; CHECK POINT SECTOR ADDRESS ; ; EQUATES FOR FLMGMT PARAMETER LIST ; THREAD = 0. ; THREAD WORD ERROR = 2. ; ERROR INDICATOR ERRTSK = 3. ; TASK TO QUEUE IF ERROR SYSTEM = 4. ; RESERVED FOR FLMGMT FILEID = 6. M. PASS TSTB (R1)+ ;BUMP TO 10,000 POSITION MOV #5,R0 ;SET POSITION INDEX FOR LOOP CLR R5 ; CLEAR BINARY INTEGER ACCUM. ATB010: MOVB (R1)+,R4 ; GET ASCII BYTE AND BUMP BEQ ATB020 ;IF BINARY ZERO-SUPPRESS CMPB #SPACE,R4 ;IF ASCII SPACE-SUPPRESS BNE ATB105 ;SIGNIFICANT-START CALCULATION ATB020: DEC R0 ; FINISHED WITH STRING BNE ATB010 ;NO: GO REMOVE IT FROM UNDEF AREA BISB #DBLDEF,FLAGS(R4) ;FLAG OLD ONE AS A DOUBLER BISB #DBLDEF,FLAGS(R1) ;ALSO FLAG NEW ONE BR LODE44 ;BYPASS REMOVAL LODE42: JSR PC,SQUISH ;REMOVE FROM UNDEFINED TABLE LODE44: MOV R1,R4 ;AGAIN POINT TO INPUT ENTRY JSR PC,INPTRH ;INSERT IT ALPHABETICALLY IN THIS SECT'N ;IF IT WAS DOUBLY DEFINED, BOTH ENTRIES ARE FLAGGED AS SUCH. THE FIRST ;ENTRY WILL BE USED CLR ASCII ; CLEAR SIGN & 10,000 POSITION MOV BUFST,ASCII2 ; SET UP 1,000 & 100 POSITION MOV BUFST+2,ASCII4 ; SET UP 10 & DIGIT POSITION MOV #ASCII,-(SP) ; ASCII STRING ADDRESS EMT ASCBIN ; CONVERT ASCII TO BINARY MOV (SP)+,R1 ; GET CONVERTED A.C. TST (SP)+ ; CONVERSION ERROR OCCUR? BNE IPTA20 ; YES - EXIT MOV #AUTCOD,R0 ; SEARCH AUTCOD TA ; FILE ID FLTYPE = 8. ; FILE TYPE SYSTMB = 9. ; RESERVED FOR FLMGMT LENGTH = 10. ; LENGTH OF FILE TO DEFINE ; ; MISCELLANEOUS EQUATES ; PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 340 ; PRIORITY LOCKOUT MASK RDLEV = 3. ; DISC LEVEL AT WHICH TO READ UDLEV = 1. ; DISC LEVEL AT WHICH TO UPDATE STKSZ = 50. ; STACK SIZE ;NO-TRY AGAIN BR ATB110 ;YES-FINISHED ; ; PERFORM CONVERSION BY MULTIPLYING AN INITIALLY ; CLEARED ACCUMULATOR BY 10(MULTIPLYING ITS CONTENTS ; BY 5 AND THEN DOUBLING) AND ADDING THE ; ASCII EQUIVALENT BCD VALUE. THIS WILL BE DONE ; FOR EACH SIGNIFICANT POSITION LEFT TO RIGHT. ; EACH DIGIT'S RESULT IS STORED BACK IN THE ; ACCUMULATOR TO USE FOR THE NEXT CALCULATION. ; ATB100: MOVB (R1)+,R4 ;GET NEXT ASCII BYTE AAS THE REF'D VALUE. THE MAP WILL SHOW ALL OF THEM. BR LODD20 ; * * * GLOBAL REF * * * LODE50: JSR PC,PTGLOB ;IS IT IN LSD ALREADY? BR LODE52 ;NOT FOUND: INSERT IT BR LODD20 ;FOUND: NO NEED TO DO ANYTHING LODE52: JSR PC,INUSYM ;INSERT AS AN UNDEFINED BR LODD20 .PAGE ;NOW ALL OBJ MODULES HAVE BEEN PASSED OVER ONCE, ALL ; GSD'S HAVE BEEN PROCESSED, AND THE LOADER'S SYMBOL DIRBLE FOR MATCH IPTA10: CMP (R0)+,R1 ; MATCH? BEQ IPTB00 ; YES - CONTINUE TST (R0) ; END OF TABLE? BPL IPTA10 ; NO- KEEP-A- SEARCHIN' .ENDC .IFNZ $DEBUG BR IPTB00 .ENDC IPTA20: EMT EXIT ; EXIT FROM TASK ; ; MESSAGE INTERPRETER ; IPTB00 = . MOV #TTRLST,-(SP) ; TTY I/O LIST FOR READY MSG TO STACK EMT TTYOUT ; TYPE "? FOR DISC INITIALIZATION TASK ENTRY = 2. ; ENTRY POINT IN TASK HEADER ; .PAGE .CSECT FMCODE ; ; DEFINE = . JSR R5,PUSHR ; SAVE REGISTERS CLR R0 ; DEFINE ENTRY BR FLMA10 ; PROCESS ; DELETE = . JSR R5,PUSHR ; SAVE REGISTERS MOV #1,R0 ; DELETE ENTRY BR FLMA10 ; PROCESS ; PRTCT = . JSR ND BUMP ATB105: SUB #ZERO,R4 ;ASCII NUMERIC TO BCD BMI ATB200 ;ERROR IF LESS THAN ZERO CMPB R4,#NINE BHI ATB200 ;ERROR IF GREATER THAN NINE MOV R5,R3 ; ACCUM. TO SHIFT 2 MOV R3,R2 ;DUPLICATE IN SHIFT 1 ACCUM. ASL R3 ; MULTIPLY ASL R3 ; BY 4 ADD R3,R2 ; SAME AS N*5 ADD R2,R2 ; SAME AS N*10 ECTORY ; (LSD) HAS BEEN CONSTRUCTED. NOW THE LSD MUST BE PASSED OVER ; TO ASSIGN LOAD MODULE RELATIVE ADDRESSES TO ALL GLOBAL SYMBOLS, ; AND SECTION BASES ASSIGNED. THE LOAD MAP WILL THEN BE PRINTED, ; SHOWING LOAD MODULE RELATIVE ADDRESSES, MULTIPLY DEFINED SYMBOLS ; ACCOMPANIED BY A "M" FLAG. LODF00: ;END OF PASS 1 ; NOW WE MUST CREATE A SECOND ABSOLUTE SECTION: <. MON.>, WHICH WILL ; CONTAIN ANY VALID MONITOR REFERENCES. THE UNDEFINEDS ARE SCANNED " WITH EXIT TYPE 1 MOV #MXCHIN,INBUF ; SET TO INPUT OPERATOR COMMAND MOV #INBUF,DATADR ; SET BUFFER ADDRESS IN LIST CLR BUFST+2 ; RESET DELIMITER POSITION MOV #TTYLST,-(SP) ; TTY I/O LIST TO STACK EMT TTYIN ; WAIT FOR COMMAND TST INERR ; TIME-OUT OCCUR BNE IPTA20 ; YES- CANCEL THIS TASK MOV #NOCHAR,R5 ; SIZE OF INPUT MSG ADDRESS MOV (R5)+,R4 R5,PUSHR ; SAVE REGISTERS MOV #2,R0 ; PRTCT ENTRY BR FLMA10 ; PROCESS ; UNPRCT = . JSR R5,PUSHR ; SAVE REGISTERS MOV #3,R0 ; UNPRCT ENTRY ; FLMA10 = . MOV 14.(SP),R1 ; GET FLMGMT PARAMETER LIST MOVB R0,SYSTEM(R1) ; SAVE ENTRY POINT MOV PSR,-(SP) ; SAVE PROCESSOR STATUS ON STACK MOV #1.,R0 ; PRESET ERROR TYPE RE ADD R4,R2 ;COMBINE WITH BCD VALUE MOV R2,R5 ; SET IN BINARY INT. ACCUM DEC R0 ;FINISHED WITH STRING? BNE ATB100 ;NO ATB110: CMPB #MINUS,-6(R1) ;YES-STRING SIGN NEGATIVE BNE ATB120 ;NO NEG R5 ; YES-NEGATE BINARY INTEGER ATB120: CLR 16.(SP) ; SET NO ERROR INDICATOR ATB130: MOV R5,14.(SP) ; SET BIN. INT. IN STACK JSR R5,POPR ; FOR ANY MATCHES WITH ANY OF THE SYMBOLS IN THE RESIDENT MONITOR ; SYMBOL TABLE. THESE ARE PUT INTO <. MON.> AND GIVEN THE VALUE ; SHOWN IN THE MONITOR TABLE. MOV #LSDBGN,R4 ;PTR TO SYMBOL TABLE ADD #BPSYM,R4 ;SKIP FIRST MODULE NAME LODF01: ADD #BPSYM,R4 ;SKIP <. ABS.> AND SUBSEQUENT ENTRIES CMPB #GENTRY,FLAGS+1(R4) ;IS THIS ANOTHER "ABS" SYMBOL? BEQ LODF01 ;YES - KEEP ADVANCING JSR PC,UNSQUIS ; GET NO. CHARACTERS INPUT BEQ IPTA20 ; CARRIAGE RETURN-EXIT SUB #2.,R4 ; MUST BE AT LEAST TWO BMI IPTB20 ; CHARACTERS OR ERROR DEC R4 ; R4= # CHARS. IN PARAMETER MOV #OPCOMM,R3 ; ADDRESS OF OPCOMM TO R3 FOR IPTB10: CMP (R5),(R3)+ ; OPERATOR COMMAND CODE SEARCH BEQ IPTC00 ; FOUND IT TST (R3)+ ; BUMP TO NEXT POSSIBLE COMMAND GISTER MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT DEC (R1) ; IS LIST THREADABLE? BNE FLMA30 ; NO - ERROR TYPE 1 MOV (SP),PSR ; RESET PRIORITY LOCKOUT INC R0 ; BUMP ERROR TYPE REGISTER CMP #NDISCS+$SYSFL,FILEID(R1) ; FILE ID VALID? BHIS FLMA30 ; NO - NDISCS+1 < FILE ID <= $IDMAX 1/23/73 CMP #$IDMAX,FILEID(R1) ; OTHERWISE BLT FLMA ; RESTORE REGISTERS RTS PC ; RETURN TO CALLER ; ; ERROR IN STRING ; ATB200 = . MOV R4,16.(SP) ; SET ERROR INDICATOR BR ATB130 ; ; .END H ;MAKE A HOLE HER FOR <. MON.> SECTION MOV R4,PTSECT ;POINTER TO CURRENT SECTION MOV MONSEC,(R4)+ ;MOVE IN NAME MOV MONSEC+2,(R4)+ MOV #SECTN*400+UNDEF,(R4)+ ;SET FLAG: ABSOLUTE SECTION NAME EMT CORLOD ;RETURNS WITH... MOV (SP)+,R2 ;...POINTER TO TABLE OF MONITOR REFS MOV SYME,R4 ;POINTER TO BEGIN OF UNDEFINEDS BR LODF03 ;AVOID FIRST "ADD" LODF02: AD TST (R3) ; END OF TABLE? BNE IPTB10 ; NO- KEEP LOOKING IPTB20: MOV #ER1MSG,DATADR ; YES- REPORT ERROR IPTB21: MOV #TTYLST,-(SP) ; TTY I/O LIST TO STACK EMT TTYOUT ; TYPE "ILL CMD!" BR IPTB00 ; REQUEST AGAIN ; ; TRANSFER TO APPROPRIATE PROCESSOR. ; CALLING SEQUENCE: ; JSR PC, PROCES ; WHERE R5 = ADDRESS OF COMMAND STRING ; 30 ; ERROR TYPE 2 1/23/73 INC R0 ; BUMP ERROR TYPE REGISTER JSR PC,GFTYPE ; GET FILE TYPE FROM LIST CMP R2,#$FTMAX ; IS IT VALID IN THIS SYSTEM? BHI FLMA30 ; NO - ERROR TYPE 3 1/23/73 INC R0 ; BUMP ERROR TYPE MOVB FSTAT(R2),R3 ; GET LOGICAL DISC FOR THIS TYPE BIC #177740,R3 ; ISOLATE MOVB R3,SD #BPSYM,R4 ;GET TO NEXT UNDEFINED LODF03: CMP R4,USYME ;EXHAUSTED UNDEFINEDS? BEQ LODF09 ;YES MOV R2,R3 ;INIT TEMP PTR TO MONITOR SYMBOLS LODF04: CMP (R3),#-1 ;EXHAUSTED MONITOR SYMBOLS? BEQ LODF02 ;YES: GET NEXT UNDEFINED CMP (R3),(R4) ;DO FIRST 3 CHARS IN NAME MATCH? BNE LODF05 CMP 2(R3),2(R4) ;FINAL 3 CHARS? BEQ LODF06 ;MATCH! DELIMITER POSITION ; R4 = NO. OF CHARACTERS IN PARAMETER ; IF LESS THAN 0-NONE ; IPTC00 = . TST (R3) ; IF ZERO- EX..IT COMMAND BEQ IPTA20 ; YES, GOOD-BY TST (R5)+ ; R5 = ADDRESS OF DELIMITER POSITION TST R4 ; SET CONDITION CODES ST EXISTANCE OF 1/31/73 ; A PARAMETER CAN BE DETECTED. 1/3YSTEM+1(R1) ; SAVE ASL R3 ; USE AS WORD INDEX TST PHYDEV(R3) ; IS DEVICE AVAILABLE? BMI FLMA30 ; NO - ERROR TYPE 4 1/23/73 INC R0 ; BUMP ERROR TYPE TST ACTIVE ; CALLED BY A TASK? BEQ FLMA30 ; NO - CAN'T SUSPEND - ERROR TYPE 5 1/23/73 MOV $CTASK,R3 ; GET CALLING TASK NUMBER INCB IOSTAT(R3) ; SET TASK'S I/O S; UPDATE 12/8/72 IPL2.CS2 ; UPDATE 11/20/72 IPL2.CS1 ******** $DTAPE = 0 ; FORCE NO DECTAPE ******** OVRLAY = 0 ; FORCE NO OVERLAY TASKS ******** ; UPDATE 11/20/72 IPL2.C04 ; UPDATE 1106/72 IPL2.C03 ; UPDATE 10/20/72 IPL2.C02 ; UPDATE 10/18/72 IPL2.C01 ; UPDATE 6/22/72 IPL2.S27 ; UPDALODF05: ADD #6,R3 ;BUMP TO NEXT MON SYMBOL BR LODF04 LODF06: MOV #GENTRY*400+UNDEF+INTGLB,FLAGS(R4) ;ABS-DEFINED-GLOBAL MOV 4(R3),VALR(R4) ;LOAD SYMBOL VALUE INTO LSD MOV R4,R0 ;XFER SOURCE POINTER MOV #OBJBK1,R1 ;USE AS TMPY BUFFER MOV (R0)+,(R1)+ ;XFER TO TEMP BUFFER MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ JS1/73 JSR PC,@(R3)+ ; PERFORM COMMAND PROCESS - INC. TO SAVE WORD ; ; RETURN FROM OPERATOR COMMAND PROCESSORS HERE ; OPCOMR = . TST R5 ; DID AN ERROR OCCUR BNE IPTB00 ; NO-SEND READY FOR ANOTHER REQUEST MOV #ER2MSG,DATADR ; TYPE "ILL PAR!" BR IPTB21 ; ******** ; TATUS MOVB R3,SYSTMB(R1) ; SAVE TASK NUMBER FOR UNSPND MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT MOV R1,@FMLAST ; THREAD REQUEST IN MOV R1,FMLAST ; FILE MANAGEMENT QUEUE INC NOFMRQ ; INCREMENT NO. REQUESTS IN QUEUE MOV (SP)+,PSR ; RESET LOCKOUT AND POP STACK JSR R5,POPR ; RESTORE REGISTERS MOV PSR,2.(SP) ; SET PS ON STACK FOR QSAVEI CLR TE 5/17/72 IPL2.S26 ; UPDATE 5/16/72 IPL2.S25 ; UPDATE 5/16/72 IPL2.S24 ; UPDATE 5/5/72 IPL2.S23 ; UPDATE 5/2/72 IPL2.S22 ; UPDATE 4/17/42 IPL2.S21 ; UPDATE 4/14/72 IPL2.S20 ; UPDATE 4/12/72 IPL2.S19 ; UPDATE 4/10/72 IPL2.S18 ; UPDATE 4/5/72 IPL2.S17 ; UPDATE 3/23/72 IPL2.S16 ; UPDATE 3/21/72 IPL2.S15 ; UPDATE 3/R PC,SQUISH ;REMOVE ENTRY FROM UNDEFINEDS MOV #OBJBK1,R4 JSR PC,INPTRH ;PUT IT IN THE <. MON.> SECTION MOV R0,R4 ;NEW POINTER TO UNDEFINEDS BR LODF03 ;MORE LODF09: CLR PRSIZE ;INIT PROGRAM LOAD SIZE MOV #LSDBGN,R0 ;INIT PTR TO LSD MOV R0,PTROBJ ;...AND TO CURRENT OBJ MODULE BR LODF20 LODF10: ADD #BPSYM,R0 ;NEXT ENTRY LODF20: CMP R0 ******** .IFZ $DEBUG ; ONLY IF HAVE CODES GO CHANGE. ******** ; NUCODE ALLOWS THE AUTHORIZATION CODE TO BE CHANGED ONLINE. ******** ; ******** NUCODE: CMPB (R5)+,#COMMA ; IS THE DELIMITER A COMMA! ******** BNE RESERR ; NO ERROR ******** CMP R4,#4 ; ARE THERE FOUR DIGITS IN THE NEW # ? ******** -(SP) ; REQUEST VOLUNTARY SUSPENSION OF TASK JSR PC,QSAVEI ; DO IT MOV #DSPTCH,-(SP) ; RETURN TO DISPATCHER WHEN THROUGH MOV PSR,-(SP) ; SAVE PROCESSOR STATUS ON STACK MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT TST FMACTV ; FILE MGMT. CURRENTLY PROCESSING REQUESTS? BEQ FLMB00 ; NO FLMA20: MOV (SP)+,PSR ; YES- RESET PRIORITY LOCKOUT RTS PC ; FLMA30: JMP 20/72 IPL2.S14 ; UPDATE 3/17/72 IPL2.S13 ; UPDATE 3/13/72 IPL.S12 ; UPDATE 2/16/72 IPL2.S11 ; UPDATE 1/19/72 IPL2.S10 ; UPDATE 1/12/72 IPL2.S09 ; UPDATE 12/11/71 IPL.S08 ; UPDATE 12/10/71 IPL.S07 ; UPDATE 12/2/71 IPL.S06 ; UPDATE 11/18/71 IPL.S05 ; UPDATE 11/15/71 IPL.S04 ; UPDATE 11/12/71 IPL.S03 ; UPDATE 11/11/71,SYME ;END OF LSD? BHIS LODF90 ;YES: EXIT LOOP MOVB FLAGS+1(R0),R1 ;ENTRY TYPE MOVB FLAGS(R0),R2 ;QUALITIES FLAG CMPB R1,#GENTRY ;GLOBAL SYMBOL? BEQ LODF50 ;YES DEC R1 ;SECTION NAME? BNE LODF10 ;NO: GET NEXT ENTRY .PAGE ;*******SECTION NAME: MAKE ITS SIZE EVEN, STORE ITS BASE VALUE, SET PTR ; TO THIS SECTION, AND INCREMENT THE TOTAL PROGR BNE RESERR ; NO ERROR ******** MOV #ASCII,R0 ; GET ADDRESS OF ASCII BUFFER ******** MOV R0,-(SP) ; AND SAVE ON STACK FOR CONVERSION ******** CLR (R0)+ ; CLEAR SIGN AND 10,000 PLACE ******** 5$: MOVB (R5)+,(R0)+ ; MOVE THE 4 CHARACTERS INTO THE BUFFER.******** SOB R4,5$ ; LOOP TILL DONE. ******** EMT ASERRA00 ; FLMB00 = . INC FMACTV ; SET FILE MANAGEMENT ACTIVE FLMB10 = . MOV (SP),PSR ; RESET PRIORITY LOCKOUT MOV FMFRST,R1 ; ADDRESS OF FIRST REQUEST IN QUEUE JSR PC,GFTYPE ; GET FILE TYPE MOV #PLOCK,PSR ; SET LOCKOUT AGAIN CMP R2,CPRSIP ; COMPRESSION IN PROGRESS THIS FILE TYPE? BEQ FLMC00 ; YES-PUT IN WAIT QUEUE BISB #200,FSTAT(R2) IPL.S02 ; UPDATE 11/10/71 IPL.S01 .TITLE IPL ;*********************************************************************** ;* * ;* INITIAL PROGRAM LOAD WILL INITIALIZE THE ROS SYSTEM AND * ;* THEN EXIT TO DISPATCH. THIS MODULE SHOULD BE EXECUTED * ;* BEFORE ENTERING ROS FOR THE FIRST TIME. * ;* AM SIZE. BITB #ABSREL,R2 ;ABSOLUTE OR RELOCATABLE? BNE LODF30 ;REL CLR VALR(R0) ;ABS: SET SIZE... CLR BASE(R0) ;...AND BASE = 0 BR LODF40 LODF30: ;RELOCATABLE SECTION MOV VALR(R0),R3 ;SECTION SIZE MOV R3,R4 ASR R4 ADC R3 ;MAKE SIZE EVEN MOV PRSIZE,BASE(R0) ;SET BASE OF NEW SECTION ADD R3,PRSIZE ;SUM UCBIN ; GO CONVERT IT. ******** MOV (SP)+,R0 ; GET CONVERTED NUMBER. ******** TST (SP)+ ; ANY CONVERSION ERRORS ******** BNE RESERR ; YES ******** MOV R0,AUTCOD ; NO. PUT NEW NUMBER INTO FIRST SLOT. ******** RTS PC ; AND RETURN. ******** .ENDC ; ; SET FILE MGMT. IN PROGRESS THIS TYPE MOV (SP),PSR ; RESET PRIORITY LOCKOUT MOVB SYSTEM(R1),R0 ; GET ENTRY POINT TO FLMGMT ASL R0 ; WORD INDEX JMP @TPCALL(R0) ; GO TO APPROPRIATE PROCESSOR ; ; COMPRESSION IN PROGRESS FOR THIS FILE TYPE. COMPRS IS AN ; OVERLAY TASK THAT IS NOT CHECKPOINTABLE. THEREFORE IT WILL ; BE CORE RESIDENT WHILE CPRSIP NOT EQUAL =1. THUS THE LOGIC ; TO TAKE A REQUEST OUT OF * ;* PROGRAMMER 51,52,53 AND 54 * ;* DATE 11/9/71 * ;* REVISION ;* REVISION * ;* * ;*********************************************************************** .DEF IPL,SSTACK .DEF DYNSIZ ; # BYTES IN DYNAMIC POOL .DEF ENP TOTAL SIZE (& END OF THIS SECT) LODF40: MOV R0,PTSECT ;POINTER TO NEW SECTION BR LODF10 ;GET NEXT ENTRY ;*******GLOBAL ENTRY POINT LODF50: BITB #ABSREL,R2 ;ABS OR REL? BEQ LODF60 ;ABS MOV PTSECT,R3 ;POINTER TO CURRENT SECTION MOV BASE(R3),BASE(R0) ;SECTION BASE ADD VALR(R0),BASE(R0) ;CALC OFFSET FROM LOAD MOD BASE BR LODF10 ;NEXT LODF60: ******** ; ; ;*********************************************************************** ;* * ;* RESET LOGICAL DEVICE AVAILABLE IN ROS PHYSICAL DEVICE TABLE. * ;* TO BE FUTHER DOCUMENTED AFTER ROS 1 DEMO. * ;* * ;*********************************************************************** .DEF THE FLMGMT QUEUE AND PUT IT IN ; A COMPRS WAIT QUEUE WILL BE FOUND IN COMPRS. ; R1 = FLMGMT LIST ADDRESS ; FLMC00 = . MOV #$CPTNO,R0 ; COMPRESS TASK NUMBER ASL R0 ; WORD INDEX MOV HEADER(R0),R0 ; COMPRS TASK HEADER ADDRESS JSR PC,@ENTRY(R0) ; DO IT-NOTE: CALLED UNDER LOCKOUT JMP DEFB25 ; SEE IF ANY MORE REQUESTS ; ; ERRB06 = . MOV #6.,R0 ; REDDYN,DYSINI ; ******** .REF CLINIT .REF RQUEST,SAVE,DSPTCH,TPRTY,HEADER .REF PFSIPL,PSTIPL .REF TSTAT,SYSINI,DINT .REF EMTINIT .REF PRTINT,KBDINT ;TTYIO PRINTER AND KEYBOARD ;INTERRUPT ROUTINES .REF TTINIT ;TTYIO INITIALIZATION SUBROUTINE .REF TTYOUT,QUEUE,MTINT ; ******** .IFG MOV VALR(R0),BASE(R0) ;HAS ABS VALUE BR LODF10 .PAGE ;NOW ALL ENTRY POINTS AND SECTION BASES HAVE BEEN ;RELOCATED WITH RESPECT TO PROGRAM BASE ZERO. ;NOW TIME TO PRINT THE LOAD MAP. LODF90: MOV #ND1MSG,TTYBUF ;INIT TO PRINT "END PASS 1" ON TTY MOV #TTYLST,-(SP) EMT TTYOUT ; NOW FILL PRINT BUFFER W/CURRENT DATE AND TIME. ; THE DATA RETURNED FROM THE "GET" SUBROUT RESET .REF LOGMAX,PHYDEV,CVTBIN ; ; COMMA = 54 ; ASCII COMMA ; RESET = . JSR PC,RES010 ; GET LOGICAL UNIT CMP R4,LOGMAX ; VALID LOG. DEVICE BGT RESERR ; NO-ERROR ASL R4 ; COMPUTE WORD INDEX BIC #120000,PHYDEV(R4) ; SET DEVICE NOT AVAILABLE ; ; ALTERNATE NOT IN USE RTS PC ; RETURN TO CAPORT ERROR TYPE 6 JMP ERRB99 ; ERRB07 = . MOV #7.,R0 ; REPORT ERROR TYPE 7 JMP ERRB99 ; ; DEFINE A FILE ; R1= PARAMETER LIST ; R2 = FILE TYPE ; DEFA00 = . .IFNZ DRESDI TSTB FLTYPE(R1) ; CORE RESIDENT ENTRY REQUESTED? BPL DEFA10 ; NO .ENDC CLR R0 ; REQUEST SEARCH OF CORE DIRECTORY JSR PC,CDSRCH NLP ; ONLY IF HAVE LINE PRINTERS .REF LPINIT .ENDC .IFG NCR ; ONLY IF HAVE CARD READERS .REF CRINIT .ENDC .IFNZ $DTAPE .REF DTINT .ENDC ; .CSECT .IFZ OVRLAY SSTACK = . ; BEGIN SYSTEM STACK HERE FOR ROS I .ENDC PSR = 177776 ; PROCESSOR STATUS REGISTER EQUATE PSBENB = 165400 ; DEVICE ADDRESS AT WHICH INES IS LEFT ON THE ; STACK TO BE POPPED BY THE "BINASC" ROUTINE. MOV #TMPBUF+4,R0 MOV #YEAR,R1 MOV #3,R2 EMT GEDATE LODF92: MOV #TMPBUF,-(SP) EMT BINASC ;CONVERT DATE TO ASCII MOV (R0),(R1) ;TRANSFER CHARS TO PRINT BUFFER CMP -(R1),-(R1) ;POINT TO NEXT PRINT BUFFER SPACE DEC R2 ;DO FOR THREE VALUES BGT LODF92 EMT GETIME LLER ; ; RES010: CMPB (R5)+,#COMMA ; DELIMETER A COMMA? BNE RSERR ; NO-ERROR TST R4 ; PARAM. MUST BE 1-3 CHARS. BEQ RSERR CMP R4,#3. BHI RSERR JSR PC,CVTBIN ; CONVERT TO BINARY INTEGER TST R5 BEQ RSERR ; CONVERSION ERROR RTS PC ; ; ERROR OCCURED ; RSERR = . TST (SP)+ ; POP STACK RESERR = ; FOR AVAILABLE ENTRY BEQ ERRB06 ; NO SPACE AVAIL.- ERROR TYPE 6 MOV R3,CDAVAL ; SAVE ENTRY'S ADDRESS MOV R4,CDIFD ; SAVE ENTRY'S IFD DEFA10 = . MOV FILEID(R1),R0 ; GET FILE ID # TO DEFINE .IFZ DRESDI JSR PC,CDSRCH ; DOES FILE ALREADY EXIST? .ENDC .IFNZ DRESDI JSR PC,DDREAD ; SET-UP FOR DISC DIRECTORY READ MOV #DEFA20,IOCOMP TO ENABLE ; ; MANUAL PUSHBUTTON ; ; INTERRUPT VECTOR EQUATES ; MPSHBT = 244 ; MANUAL PUSHBUTTON MPSHLV = 200 ; BR4 FOR MANUAL PUSHBUTTON .IFZ $SAVE-3 ; ONLY IF REAL SAVE (BPT TRAP) SAVTRP = 14 ; SAVE TRAP .ENDC .IFZ $SAVE-104400 ; ONLY IF ODT SAVE (TRAP TRAP) SAVTRP = 34 .ENDC SAVLEV = 340 ; SAVE UNDER LOCKOUT MOV #TMPBUF,-(SP) EMT BINASC MOV (R0),HOUR MOV #TMPBUF,-(SP) EMT BINASC MOV (R0),MINUTE MOV #HEDING,MAPBUF ;PRINT HEADING JSR PC,LPCALL ;GO ASK FOR LINE PRINTER MOV #LSDBGN,R0 CLR PRSIZE ;INIT CUMULATIVE LOAD MODULE SIZE BR LODG20 LODG10: ADD #BPSYM,R0 ;NEXT ENTRY LODG20: CMP R0,SYME ;END OF LSD? BHIS LODH10 . CLR R5 ; SET ERROR GUY RTS PC ; RETURN ; ******** ; ******** ; DELTSK IS USED TO DELETE (RATHER THAN DISABLE) ANY TASK EXCEPT INPUT ******** ; IN THE ROS SYSTEM. ******** ; ******** ; SET-UP I/O COMPLETE ADDRESS MOVB #RDLEV,DLVL ; PRIORITY OF DISC I/O CLRB IOFCN ; REQUEST READ MOV CRRSCT,RLSECT ; SET-UP RELATIVE SECTOR MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,DISCIO ; READ APPROPRIATE SECTOR OF DIRECTORY BR FLMA20 ; EXIT-WAIT FOR I/O COMPLETE ; ; DIRECTORY READ I/O COMPLETE ; DEFA20 = . MOV FMFRST,R1 ; ADDRESS OF CURRENT .CSECT SYSBLD ; FOR MOD. TO WRITE TO DDC DISK ******** .CSECT .IPLTV ; ******** JMP IPL ; GO TO IPL FROM 12000 - ONLY FOR ******** ; COLD STRAT VERSION OF ROS ******** .CSECT .ALINT ; PICK UP ASYNC'S INIT ROUTINE. ******** .CSECT .CRINT .CSECT .LPINT .CSECT .SYSIN .CSECT .DYSIN ;YES: EXIT LOOP MOVB FLAGS+1(R0),R1 ;ENTRY TYPE BEQ LODG30 ;OBJ MOD NAME DEC R1 BEQ LODG40 ;SECTION NAME CMP R1,#3 ;ENTRY? BNE LODG10 ;NO: IGNORE MOV #GLOBAL,-(SP) ;YES:***PRINT ENTRY NAME & VALUE*** MOV R0,-(SP) EMT R50UNP ;RAD50 UNPACK MOV 10(R0),R4 ;GLOBAL'S VALUE RELATIVE TO LOAD BASE 0. MOV DELTSK: JSR PC,DSABLE ; FIRST DISABLE IT. THIS ALSO CHECKS ******** TST R5 ; TO SEE IF WE CAN DELETE IT. ANY ERR? ******** BEQ 30$ ; YES - GO BACK THEN. ******** ASL R4 ; SHIFT TASK # INTO WORD INDEX. ******** ; IT WAS RETURNED FROM DISABLE. ******** CMP R4,#MXTASK+MXTASK ; SEE IF OVERLAY TASK. ******** BLE REQUEST JSR PC,TSTDER ; TEST FOR DISC ERROR TST @CRREAD ; ENTRY AVAILABLE .ENDC BNE ERRB07 ; FILE ALREADY DEFINED-ERROR TYPE 7 .IFNZ DRESDI JSR PC,GFTYPE ; GET FILE TYPE .ENDC MOV LENGTH(R1),R0 ; GET LENGTH OF FILE TO DEFINE BEQ DEFC01 ; ZERO-LOOK FOR LARGEST AREA AVAILABLE .IFNZ $TMSLC!CHKPTC BITB #100,FSTAT(R2) ; CHECKPOINT ARE .CSECT .QUEUE .CSECT .EMTIN .CSECT .CLINT .CSECT .TTYIN .CSECT .MAIN. ; START OF CODE. MUST BE AFTER OTHER NAMED ; IPL = . RESET ; SEND INIT PULSE TO ALL DEVICES MOV #340,PSR ; SET CPU LEVEL TO 7 DURING IPL MOV #SSTACK,SP ; SET UP SYSTEM STACK .IFZ $SAVE-104400 MOV 14,-(SP) MOV 16,-(SP) .ENDC JSR PC,PSTIPL #GLBVAL+6,R3 ;END OF ASCII BUFFER JSR PC,BIN2OC ;CONVERT BINARY TO OCTAL ASCII MOVB #' ,MFLAG ;INIT "M" FLAG POSITION WITH SPACE BITB FLAGS(R0),#DBLDEF ;WAS THIS SYMBOL MULTIPLY DEFIND BEQ LODG25 MOVB #'M,MFLAG ;YES: SET TO FLAG ENTRY IN MAP LODG25: MOV #ENTRY,MAPBUF ;SET UP TO PRINT ENTRY LINE JSR PC,LPCALL BR LODG10 ;NEXT .PAGE LODG30: ;***PRINT OB20$ ; NO - DON'T DELETE IT'S FILE. ******** MOV IFD(R4),DELBID ; SET TASK'S FILE ID INTO DELETE BLK. ******** ; MOVB #200!$OVTYP,DELBTP ; SET CORE RES., OVERLAY FILE TP1/31/73 MOV #DELBLK,-(SP) ; AND DELETE THE TASKS FILE (IF ANY. ******** EMT 52 ; ******** 20$: MOV #1,HEADER(R4) ; SET TASK'S HEADER TO =NOT IN SYSTEM'. ******** BR TIA20 ; A REQUIRED? BEQ DEFA25 ; NO ADD R0,R0 ; YES-DOUBLE LENGTH REQUIRED .ENDC DEFA25: ASL R2 ; FILE TYPE WORD INDEX MOV FLAST(R2),R3 ; LAST SECTOR AVAIL. THIS TYPE MOV FNEXT(R2),R4 ; NEXT SECTOR AVAIL. THIS TYPE SUB R4,R3 ; NO. SECTORS AVAIL. THIS TYPE CMP R0,R3 ; ENOUGH SECTORS AVAIL. THIS WAY? BHI DEFC00 ; NO-SEARCH FOR DELETED ENTRYS ; TRAP INIT. ; ******** MOV #0600,@#177774 ; SEY KERNAL STACK LIMIT REGISTER ******** ; ******** .IFZ $SAVE-104400 MOV (SP)+,16 MOV (SP)+,14 .ENDC JSR PC,PFSIPL ; FOWER FAIL INIT. ; ; SET UP INTERRUPT AND TRAP VECTORS ; MOV #SAVE,SAVTRP ; SET UP SAVE JECT MODULE'S NAME*** MOV #TITLE,-(SP) MOV R0,-(SP) EMT R50UNP ;UNPACK MODULE'S NAME MOV #MODULE,MAPBUF ;INIT TO PRINT MODULE NAME & HEADING JSR PC,LPCALL ;GO PRINT IT BR LODG10 ;NEXT LODG40: ;***PRINT PROGRAM SECTION NAME*** MOV #SECNAM,-(SP) MOV R0,-(SP) EMT R50UNP ;UNPACK SECTION NAME MOV 10(R0),R4 MOV #SECVAL+GO WRITE OUT THE TASK TABLES. ******** 30$: RTS PC ; AND RETURN. ******** ; ; ;*********************************************************************** ;* * ;* THE FOLLOWING SUBROUTINES ARE USED FOR DEMO ONLY TO: * ;* SWITCH LP TO TTY- LP,TY * ;* SWITCH TTY TO LP- TY,LP * ;*; ; R0 = LENGTH OF FILE ; R1 = PARAMETER LIST ADDRESS ; R2 = FILE TYPE WORD INDEX ; R4 = NEW START SECTOR ; DEFA27: MOV R4,NEWSS ; SAVE NEW START SECTOR ADD R0,FNEXT(R2) ; UPDATE NEXT APPROPRIATELY ASR R2 ; FILE TYPE MOV #AULIST,-(SP) ; UPDATE ALLOCATION FILE ON DISC JSR PC,PFRITE ; EXIT 1-IGNORE ERRORS DEFA28 = . .IFNZ DRESDI MOV #DEFA30,IOCOMP TRAP HANDLER MOV #SAVLEV,SAVTRP+2 .IFGE NTTYS-1 MOV #200,R1 ;INIT INTERRUPT VECTORS FOR MOV #KBDINT,60 ;TTY UNIT 0 MOV R1,62 MOV #PRTINT,64 MOV R1,66 .ENDC .IFGE NTTYS-2 INC R1 ;INIT INTERRUPT VECTORS FOR MOV #KBDINT,340 ;TTY UNIT 1 MOV R1,342 MOV #PRTINT,344 MOV R1,346 .ENDC 6,R3 JSR PC,BIN2OC ;CONVERT BINARY TO OCTAL ASCII MOV 6(R0),R1 ;SECTION SIZE MOV R1,R4 MOV #SECSIZ+6,R3 JSR PC,BIN2OC ;CONVERT BINARY TO OCTAL ASCII MOV R1,R2 ASR R2 ADC R1 ;MAKE MODULE SIZE EVEN ADD R1,PRSIZE ;ACCUMULATE LOAD MODULE SIZE MOV PRSIZE,R4 MOV #CUMSIZ+6,R3 JSR PC,BIN2OC ;CONVERT IT TO OCTAL A SWITCH CR TO TTY- CR,TY * ;* SWITCH TTY TO CR- TY,CR * ;* * ;* FOR DEMO ONLY * ;* * ;*********************************************************************** ; .REF CRDON,CRDOFF,LPON,LPOFF ; TYCRLP = . ; ADDRESS OF I/O COMPLETE MOVB #UDLEV,DLVL ; UPDATE DIRECTORY AT HIGHEST LEVEL MOVB #4.,IOFCN ; PERFORM UPDATE FUNCTION MOV CRRSCT,RLSECT ; SECTOR OF DIRECTORY TO UPDATE MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,PFRITE ; START DIRECTORY UPDATE RTS PC ; RETURN TO DISCIO ; ; FIRST I/O COMPLETE FOR DISC DIRECTORY UPDATE ; DEFA30 = . MOV FMFRST,R1 .IFG NTTYS-2 XXXXXX ;CREATE ASSY ERROR IF NTTYS .GT. 2 .ENDC .IFNZ NDISCS .IFZ $DDSDC ; ONLY FOR RF-11 DISK MOV #DINT,204 ; SET UP FOR DISC 0 MOV #240,206 ; AT INTERRUPT LEVEL 5 .ENDC .IFNZ $DDSDC ; ONLY FOR DDS DISK MOV #DINT,@#130 ; DISK 0 AT LEVEL 5. VECTOR IS 130. ******** MOV #240,@#132 ; SCII MOV #SECT,MAPBUF JSR PC,LPCALL ;PRINT SECTION NAME,BASE,SIZE,& CUM SIZE BR LODG10 ;NEXT .PAGE LODH10: ;END OF PRINTING DEFINEDS: NOW PRINT UNDEFINEDS, IF ANY CMP R0,USYME ;ANY UNDEFINEDS? BEQ LODH30 ;NO: GO TO MESSAGE LDER04: MOV #4+100000,R4 ;"UNDEFINED GLOBALS" JSR PC,ERRPRT ;PRINT MESSAGE AND RETURN MOV #UNDHED,MAPBUF JSR PC,LPC CMPB (R5)+,#COMMA ; DELIMETER A COMMA? BNE RESERR ; SET ERROR GUY CMPB (R5),#'L ; FOR LP BEQ TCL010 CMPB (R5),#'C ; FOR CR BNE RESERR ; SET ERROR GUY JSR PC,CRDON ; USE CARD READER RTS PC TCL010: JSR PC,LPON RTS PC ; CRTY = . CMPB (R5)+,#COMMA ; COMMA FOR DELIM? BNE RESERR CMPB (R5),#'T ; GET CURRENT REQUEST ADDRESS JSR PC,TSTDER ; TEST FOR DISC ERROR JSR PC,GFTYPE ; GET FILE TYPE OF REQUEST MOV CRREAD,R3 ; ADDRESS OF FILE'S ENTRY JSR PC,CREATE ; CREATE FILE'S ENTRY INTO DIRECTORY MOV #DEFA40,IOCOMP ; CHANGE I/O COMPLETE ADDRESS RTS PC ; RETURN TO DISCIO ; ; SECOND I/O COMPLETE FOR DISC DIRECTORY UPDATE ; DEFA40 = . MOV FMFRST,R1 ******** .ENDC .ENDC .IFNZ $DTAPE MOV #DTINT,214 ; SET UP VECTOR FOR MOV #300,216 ; THE DECTAPE .ENDC ; ******** ; ONLY FOR MAGTAPES IN CITGO. ******** ; ******** MOV #MTINT,@#104 ; SET UP MAGTAPE INTERRUPT VECTOR. ALL ;PRINT HEADING MOV #UNDDEF,MAPBUF ;SET UP TO PRINT FROM UNDEFINED BUF LODH20: MOV #UNDNAM,-(SP) MOV R0,-(SP) EMT R50UNP ;CONVERT TO ASCII JSR PC,LPCALL ;GO PRINT IT ADD #BPSYM,R0 ;BUMP TO NEXT ENTRY CMP R0,USYME ;REACHED END? BLO LODH20 LODH30: ;NOW PRINT "PASS 2" ON TTY MOV #PAS2MG,TTYBUF MOV #TTYLST,-(SP) EMT TTYOUT BNE RESERR JSR PC,CRDOFF RTS PC ; LPTY = . CMPB (R5)+,#COMMA ; COMMA FOR DELIM? BNE RESERR CMPB (R5),#'T BNE RESERR JSR PC,LPOFF RTS PC ; ; ; THE FOLLOWING ARE USED TO QUEUE ROS SYSTEM TASKS ; .IF DF $PCHNO ; 1/31/73 QPATCH = . ; HERE TO QUEUE THE TASK PATCHER. ******** MO ; GET CURRENT REQUEST ADDRESS JSR PC,TSTDER ; TEST FOR DISC ERROR JSR PC,GFTYPE ; GET FILE TYPE OF REQUEST TSTB FLTYPE(R1) ; CORE DIRECTORY ENTRY REQUESTED? BPL DEFB00 ; NO .ENDC ; ; R1 = REQUEST LIST ADDRESS ; R2 = FILE TYPE ; NEWSS = START SECTOR OF FILE TO DEFINE ; MOV CDAVAL,R3 ; ADDRESS OF AVAILABLE CORE ENTRY JSR PC,CREATE ; CREATE FILE'S ENTRY ******** MOV #240,@#106 ; ******** ; ; XFER TO OTHER INITIALIZATION SUBROUTINES ; JSR PC,EMTINIT ; FILL UNDEFINED EMT REFS WITH ERROR RETURN JSR PC,TTINIT ;INITIALIZE TTYIO TABLES JSR PC,CLINIT ;INIT FOR CLOCK ROUTINES .IFNZ OVRLAY JSR PC,DYSINI ; INIT. DYNAMIC STORAGE ALLOCATOR .ENDC .IFG NLP ; ONLY IF HAVE LP ;PRINT MESSAGE ; ******************************************************************** .PAGE ;PASS 1 IS NOW COMPLETED. NOW BEGIN PASS 2 TO FORM THE ;LOAD MODULE ITSELF, COMPLETE WITH HEADER AND TRAILER. ;THE METHOD IS SHOWN IN STEPS AS FOLLOWS: ;1) OPEN A TEMPORARY ELEMENT IN THE BATCH FILE AREA ;2) BUFFER IN ONE TEXT BLOCK AT A TIME FROM OBJ MODULES ;3) MODIFY RELOCATABLE CODEV #$PCHNO,-(SP) ; ******** BR QCMP20 ; ******** .IFF ; 2/6/73 QPATCH = RESERR ; 2/6/73 .ENDC ; 1/31/73 ; ******** ; IN DIRECTORY MOV #CDILST,-(SP) ; UPDATE CORE DIR. IMAGE JSR PC,PFRITE ; EXIT 1-IGNORE ERRORS MOV CDIFD,SYSTEM(R1); SET IFD IN LIST FOR USER ; ; FINISHED PROCESSING REQUEST ; R1 = LIST ADDRESS ; R2 = FILE TYPE ; DEFB00 = . CLRB ERROR(R1) ; SET NO ERROR DEFB05: BICB #200,FSTAT(R2) ; SET F.M.NOT IN PROGRESS THIS FILE TYPE CLR R0 BISB SYSTMB(R1),R0 ; TASK NO. OF JSR PC,LPINIT .ENDC .IFG NCR ; ONLY IF HAVE CARD READER JSR PC,CRINIT .ENDC .IFNZ NDISCS .REF AUFCN,AULIST,DISCIO,INIDSC .REF CDIFCN,CDILST .REF TASKS,$TKFLS,$TKFLF CLR PSR ; RESET LOCKOUT SO DISC INTERRUPT ; ; MAY BE RECEIVED CLRB AUFCN ; SET TO READ ALLOCATION FILE TYPE DIR. MOV #AULIST,-( KEYED IN ASSOC'D RLD BLOCKS ;4) BUFFER MODIFIED TEXT OUT TO TEMPORARY LOAD MODULE ;5) CREATE TRAILER FOR RELOCATING AT RUN TIME ;6) FILL IN THE HEADER AND TRAILER POINTERS ;7) DEFINE A ROS FILE AND TRANSFER LOAD MODULE TO IT ;8) MAKE APPROPRIATE CHECKS ON TASK DATA IN HEADER... ; ...AND INIT APPROPRIATE MONITOR TABLES FOR TASK ;THESE OPERATIONS ARE DONE A SECTOR AT A TIME, TO ******** .IF DF $CPTNO ; 1/31/73 QCMPRS = . ; QUEUE COMPRS JSR PC,RES010 ; GET FILE TYPE MOV #$CPTNO,-(SP) ; COMPRESS TASK NO. TO STACK .IFF ; 2/6/73 QCMPRS = RESERR ; 2/6/73 .ENDC ; SUSPENDED CALLER MOV R0,-(SP) ; TASK NO. TO STACK CLR -(SP) ; IMMEDIATE RETURN JSR PC,UNSPND ; UNSUSPEND TASK .IFZ DRESDI TST (SP)+ ; IGNORE ERROR .ENDC .IFNZ DRESDI MOV PSR,(SP) ; IGNORE ERROR AND SAVE PROCESSOR STATUS .ENDC MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT MOV (R1),FMFRST ; PULL REQUEST FROM THREAD BNE DESP) JSR PC,DISCIO ; READ FILE TYPE DIRECTORY IPLX20: CMP #1.,AULIST ; I/O COMPLETE? BNE IPLX20 ; NO-KEEP CHECKING MOVB #1.,AUFCN ; PUT BACK FCN AS WRITE IN LIST CLRB CDIFCN ; SET TO READ CORE DIRECTORY IMAGE MOV #CDILST,-(SP) JSR PC,DISCIO ; READ CORE DIRECTORY IMAGE INTO CORE DIR. IPLX30: CMP #1.,CDILST ; I/O COMPLETE? BNE IPLX30 ; NO-KEEP CHECKING ;CONSERVE PROGRAM BUFFER SPACE. ; FIRST MUST INIT TRAILER AND OTHER POINTERS... MOV PRSIZE,R0 ;TOTAL PROGRAM BYTES ADD #LDBYTS,R0 ;ACCOUNT FOR WORDS PRECEDING HEADER DEC R0 ;GET ADDRESS OF HIGHEST BYTE LOADED ASR R0 BIC #100000,R0 ASR R0 ASR R0 ASR R0 ASR R0 ASR R0 ASR R0 ;PGM BYTES/128=# WHOLE S 1/31/73 QCMP20 = . .IFNZ DPRTY CLR -(SP) ; USE PRIORITY IN TASK TABLE .ENDC .IFNZ ARG ; SHOULD HAVE FOR COMPRS MOV R4,-(SP) ; PASS FILE TYPE AS ARGUMENT .ENDC CLR -(SP) ; IMMEDIATE RETURN REQUESTED EMT QUEUE TST (SP)+ ; POP ERROR WORD BGT RESERR ; ERROR EMT EXIT ; EXIT FROM INPUT FB10 MOV #FMFRST,FMLAST ; EMPTIED QUEUE-LAST POINTS TO FIRST DEFB10: MOV #1.,(R1) ; SET REQUEST THREADABLE DECB IOSTAT(R0) ; RESET TASK'S I/O STATUS .IFNZ OVRLAY BNE DEFB20 ; NOT LAST ONE MOV (SP),PSR ; RESET PRIORITY LOCKOUT MOV R0,-(SP) ; TASK NO TO STACK JSR PC,RELTSK ; RELEASE TASK IF OVERLAY DEFB20 = . MOV #PLOCK,PSR ; SET LOCKOUT AGAIN MOVB #1.,CDIFCN ; RESET FCN IN LIST BACK TO WRITE CLRB $TKFLF ; SET UP TO READ TASK TABLE MOV #$TKFLS,-(SP) JSR PC,DISCIO ; READ TASK TABLE IPLX40: CMP #1.,$TKFLS ; I/O COMPLETE? BNE IPLX40 MOVB #1,$TKFLF ; SET FUNCTION TO A WRITE FOR OTHERS ******** ; ******** .REF QIPL ; ECTORS FOR PRGM INC R0 ;GET TO BEGIN OF NEXT SECTOR AFTER PGM MOV R0,R1 ;FIRST SECTOR FOR TRAILER ASL R0 ASL R0 ASL R0 ASL R0 ASL R0 ASL R0 ASL R0 ;NOW HAVE RELATIVE PC FOR TRAILER START CMP (R0)+,(R0)+ ;ALLOW FOR 2-WORD TRAILER HEADER MOV R0,TRAPC ;INIT PERMANENT FOLLOWER OF TRAILER PC MOV R0,TRAPCSAVE ; ; .IF DF $RASNO ; 1/31/73 QRASM = . ; QUEUE RASM MOV #$RASNO,-(SP) BR QCMP20 .IFF ; 2/6/73 QRASM = RESERR ; 2/6/73 .ENDC ; 1/31/73 ; ; .IF DF $RLDNO ; .ENDC DEFB25: DEC NOFMRQ ; DECR. NO. FILE MGMT. REQUESTS BNE DEFB30 ; PROCESS OTHER REQUESTS CLR FMACTV ; SET FILE MGMT. NOT ACTIVE JMP FLMA20 ; EXIT DEFB30: JMP FLMB10 ; ; SEARCH FILE DIRECTORY FOR AVAILABLE DISC SPACE ; R0= LENGTH REQUIRED FOR FILE ; = 0, LOOK FOR LARGEST AVAILABLE AREA ; R1 = PARAMETER LIST ADDRESS ; R2 = FILE TYPE - D ******** JSR PC,QIPL ; SET UP THE TASK TABLES. ******** ; ; SET TAPE BOOT/RECOVERY TASK INTO THE TABLES ******** ; ******** .REF COSHDR,TSTAT ; ******** MOV #1,R0 ; ******** CLRB TSTAT(R0) ; SET STATUS TO QUEUABLE ;SAVE IT FOR USE AT [LODK30] SUB #LDBYTS+4,R0 ;TRAILER START AS OFFSET FROM RELOC ZERO MOV R0,TXTBK1 ;PUT IN FIRST WORD OF LOAD MODULE CLR TXTORG ;PC @ BEGIN OF CURRENT TEXT BUFFER CLR HIGHPC ;INIT MEMORY OF HIGHEST PC MOV #LDBYTS,CURPC ;ALLOW FOR LEAD WORDS INSERTED BY LOADER MOV #LDBYTS+TXTBK1,TXTPTR ;...ALSO FOR TEXT POINTER MOV #128.,TXTCNT ;INIT FOR TWO-SECTOR TEXT TRANSF 1/31/73 QROSLD = . ; QUEUE ROS LOADER MOV #$RLDNO,-(SP) BR QCMP20 .IFF ; 2/6/73 QROSLD = RESERR ; 2/6/73 .ENDC ; 1/31/73 ; ; .IF DF $UTLNO ; 1/31/73 QUTIL = . MOV #$UTLNO,-(SP) EFC01 ; FILE TYPE WORD INDEX - DEFC00 ; DEFC00 = . ASR R2 ; CALCULATE FILE TYPE DEFC01 = . CLR SORTLN ; INITIALIZE SORT LENGTH MOV R0,LNREQ ; SAVE LENGTH REQUIRED .IFZ DRESDI MOV #DOD,R3 ; START OF CORE DIRECTORY SEARCH MOV #NCRLOC,SBUFLN ; SEARCH BUFFER LENGTH .ENDC .IFNZ DRESDI MOV DBUF,R0 ; DOD ******** MOVB #1,TPRTY(R0) ; RUN AT PRIORITY 1 ASL R0 MOV #COSHDR,HEADER(R0) ; SET UP THE TASK'S HEADER ADDRESS.******** MOV #1,TASKS ; FORCE ONLY 1 TASK IN THE SYSTEM. ******** ; ******** IPLX60 = . .ENDC MOV #CALIST,-(SP) ; PRINT ROS CALL LINE ON SYSTEM TTY. ******** JSR PC,TTYOUT ; ERS MOV #LODNAM,-(SP) ;MUST CONVERT LOAD ELEMENT NAME... MOV #BFNAME,-(SP) ;...TO RAD50 EMT R50PAK MOVB #1,BFTYPE ;TYPE = LOAD MODULE MOV #BFBLK1,-(SP) EMT BFENTR ;CREATE TEMP ELEMENT FOR LOAD MODULE TST BFBLK1 ;ERR? BNE LDER07 MOV BFSECT,R0 ;START SECTOR FOR ELEMENT W-R-T ROS FILE MOV R0,TXTSEC ;INIT REL SECT # FOR TEXT WRITES BR QCMP20 .IFF ; 2/6/73 QUTIL = RESERR ; 2/6/73 .ENDC ; 1/31/73 ; ; .IF DF $TKCNO ; 1/31/73 QTC = . MOV #$TKCNO,-(SP) BR QCMP20 .IFF ; 2/6/73 ID CURRENTLY USING JSR PC,CDSRCH ; GET DOD'S ADDRESS IN CORE MOV LGTH(R3),LNODOD ; LENGTH OF DOD FOR SEARCH MOV #DEFC10,IOCOMP ; I/O COMPLETE ADDRESS MOVB #RDLEV,DLVL ; SET UP DISC READ LEVEL CLRB IOFCN ; REQUEST READ CLR RLSECT ;START AT RELATIVE SECTOR 0 DEFC05: MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,DISCIO ; READ THE BUFFER RTS PC ; ******** IPLY10: CMP CALIST,#1 ; WAIT ON EXIT TYPE 1 ******** BNE IPLY10 ; ******** MOV #1,-(SP) ; QUEUE THE TASK AUTOMATICALLY. ******** CLR -(SP) ; DEFAULT PRIORTY ******** CLR -(SP) ; NO PASSED ARGUMENT. ******** CLR -(SP) ; RETURN AT ONCE ****** ADD R0,R1 ;GET FIRST TRAILER SECTOR MOV R1,TRASEC ;INIT IT MOV R1,TRSCSV ;...AND REMEMEBER IT FOR LATER MOV MODCNT,NAMCTR ;RE-INIT COUNTER FOR # OF OBJECT MODULES MOV #NAMBUF,NAMPTR ;RE-INIT POINTER TO MODULE NAMES MOV #TRAILBLOCK+4,TRAILPOINTER ;INIT TRAILER POINTER .PAGE LODJ10: ;LOOP HERE TO PROCESS SUCCESSIVE OBJ MODULE BLOCKS JSR PC,NXTMOD ;SET UP FOR NEXT OBJECQTC = RESERR ; 2/6/73 .ENDC ; 1/31/73 ; ; .IF DF $INITD ; 1/31/73 QDINIT = . ; QUEUE DISC INITIALIZER BGE RESERR ; ERROR IF ANY PARAMETER WAS SPECIFIED. 1/31/73 MOV #$INITD,R0 ; GET TASK NUMBER CLRB TSTAT(R0) ; SET TASK QUIESCENT MOV RETURN ; ; I/O COMPLETE FOR DIRECTORY SEARCH ; DEFC10 = . MOV FMFRST,R1 ; ADDRESS OF REQUEST LIST JSR PC,TSTDER ; TEST FOR DISC ERROR MOV #BUFFER,R3 ; START OF DISC BUFFER SEARCH MOV #120.,SBUFLN ; SEARCH 60 WORDS/120 BYTES JSR PC,GFTYPE ; GET FILE TYPE .ENDC ADD R3,SBUFLN ; END ADDRESS OF SEARCH DEFC20: TST (R3) ; DELETED ENTRY? BNE ** JSR PC,QUEUE ; ******** TST (SP)+ ; POP OF ERROR WORD ******** CLR R0 CLR R1 CLR R2 CLR R3 CLR R4 CLR R5 JMP DSPTCH ; FINISHED WITH IPL-EXECUTE ROS ; ******** ; TTY LIST FOR ROS CALL LINE. **T MODULE BR LODJ98 ;EXIT IF NO MORE LODJ12: JSR PC,GETBLK ;GET NEXT NON-GSD BLOCK BR LODJ50 ;FOUND A "MODULE-END" BLOCK BR LODK10 ;"TEXT" BLOCK BR LODJ18 ;"RLD" BLOCK BR LODJ12 ;"ISD" BLOCK: IGNORE LODJ18: MOV #3,TSWICH ;RLD! SET FLAG TO SHOW NOT FOLLOWING TXT LODJ20: ;PROCESS NEXT COMMAND IN RLD BLOCK TST R0 ;IS RLD BC EXHAUSTED R0,-(SP) ; TASK NUMBER TO STACK 1/4/73 BR QCMP20 .IFF ; 2/6/73 QDINIT = RESERR ; 2/6/73 .ENDC ; 1/31/73 ; ; .IF DF $FLTNO ; 1/31/73 QFLST = . CMPB (R5)+,#COMMA ; DELIM A COMMA BNE Q DEFC30 ; NO MOVB FTYPE(R3),R5 ; YES-GET IT'S FILE TYPE BIC #177600,R5 ; ISOLATE CMP R2,R5 ; SAME AS TYPE IN REQUEST? BNE DEFC30 ; NO MOV LNREQ,R0 ; GET LENGTH OF FILE NEEDED BNE DEFD00 ; SEE IF ADEQUATE CMP SORTLN,LGTH(R3) ; GREATER THAN SORT LENGTH? BGE DEFC30 ; NO-KEEP LOOKING MOV LGTH(R3),SORTLN ; SAVE FILE'S LENGTH ****** CALIST: .WORD 1 ; THREAD WORD ******** .BYTE SYSTTY ; USE SYSTEM TTY. ******** .BYTE 1 ; EXIT TYPE ******** .WORD 0 ; NO I/O COMPLETE ******** .BYTE 0 ; NO ERROR TASK. ******** .BYTE 1 ; PRIORTY OUTPUT ******** .W? BGT LODJ22 ;NO - CONTINUE LODJ60: ;DONE WITH BLOCK: OUTPUT TEXT, IF ANY, AND CONTINUE JSR PC,TXTOUT ;GO OUTPUT TEXT, IF BUFFER IS FULL... ; ;...OR IF "CURPC" WAS CHANGED LODJ66: ;NOW PROCESS NEW BLOCK, IF IT FORCED TEXT OUTPUT MOV TSWICH,R2 ;SWITCH INDICATES INITIATING BLOCK TYPE CMP R2,#TMAX ;IS THIS VALUE LEGAL BGT LDER12 ASL R2 ;BYTE FLST1 ; NO-LIST ALL FILE TYPES .IFNZ $BATCH CMPB (R5),#'B ; BATCH LIST? BEQ QFLST3 ; YES DEC R5 ; BUMP BACK .ENDC JSR PC,RES010 ; GET FILE TYPE TST R4 BEQ RESERR ; TYPE 0 ILLEGAL FOR FLMGMT CMP R4,#$FTMAX BGT RESERR ; NOT VALID FOR THIS SYSTEM QFLST2: MOV #$FLTNO,-(SP) ; FILE LIST TASK NO. TO STACK B MOV R3,SCHIDX ; SAVE IT'S INDEX INTO SEARCH BUFFER .IFNZ DRESDI MOV RLSECT,NEWSS ; SAVE RELATIVE SECTOR IN WHICH FOUND .ENDC DEFC30: ADD #10.,R3 ; BUMP TO NEXT ENTRY CMP R3,SBUFLN ; SEARCHED COMPLETE BUFFER? BLT DEFC20 ; NO-KEEP LOOKING .IFNZ DRESDI INC RLSECT ; BUMP RELATIVE SECTOR OF DISC DIRECTORY CMP RLSECT,LNODOD ; DONE WITH IT? BLT ORD 0,0 ; ******** .WORD CALINE ; ADDRESS OF BUFFER ******** CALINE: .WORD 2$-1$ ; NUMBER OF CHARACTERS IN BUFFER ******** .WORD 0 ; RESERVED ******** 1$: .ASCII <15><12><12>/ROSII-CITGO COLD START V01/<15><12> ; ******** .EVEN ; ******** 2$: TO WORD INDEX JMP @LODJ69(R2) .PAGE LODJ69: ;"TSWICH" JUMP TABLE LODJ12 ;T=0: TEXT FOLLOWED BY RLD. NO ACTION ON RLD REQUIRED LODK10 ;T=1: TEXT FOLLOWED BY TEXT. PROCESS SECOND TEXT BLK NOW LODJ50 ;T=2: TEXT FOLLOWED BY MODULE END. GET NEXT MODULE NOW LODJ12 ;T=3: LONE RLD (NO PREVIOUS TEXT). GET NEXT BLOCK TMAX = .-LODJ69/2-1 ;MAX ALLOWABLE T-SWITCH VALUE ; ****************************************************R QCMP20 ; QUEUE FLIST QFLST1: CLR R4 ; LIST ALL BR QFLST2 .IFNZ $BATCH QFLST3: MOV #-1.,R4 ; LIST BATCH ELEMENTS BR QFLST2 .ENDC .IFF ; 2/6/73 QFLST = RESERR ; 2/6/73 .ENDC ; 1/31/73 ; ; .IFNZ $BATCH ; ; DEFC05 ; NO-READ NEXT SECTOR AND SEARCH IT .ENDC TST LNREQ ; REQUEST LENGTH =0? BNE DEFC42 ; NOPE. ******** ASL R2 ; FILE TYPE WORD INDEX MOV FLAST(R2),R3 ; DOES DISC ALLOCATOR MOV FNEXT(R2),R4 ; PROVIDE MORE AREA SUB R4,R3 ; THAN FOUND? MOV SORTLN,R0 CMP R0,R3 BGE DE ; ******** ; ; ; ; .IFNZ OVRLAY ENDDYN = . - 2 ; TOP ADDRESS OF DYNAMIC CORE POOL ; SSTACK = 2000 ; SET UPPER STACK LIMIT. (WORD BEFORE) ******** ; .ENDC ; ; DYNSIZ: .WORD ENDDYN-SSTACK ; MAX # BYTES AVAIL. FOR DYN. AREA. ******** .END *************** LDER07:MOV #7,R4 ;"BFENTR" ERROR JSR PC,ERRPRT LDER12: MOV #12,R4 ;MAX T-JUMP TABLE INDEX EXCEEDED JSR PC,ERRPRT GETBLK: ;SUBROUTINE TO GET A NON-GSD BLOCK. KEEPS FETCHING BLOCKS ;UNTIL FINDING A TEXT, RLD, OR MODULE END BLOCK. ;RETURNS TO: RTN+0 FOR MODULE-END; RTN+2 FOR TEXT; ;RTN+4 FOR RLDF RTN+6 FOR ISD. ;IF LAST BLOCK IN LAST MODULE IS NOT TEXT, RLD, OR MND, ;NO RE BATCH FILE INITIALIZER ; BFINIT = . BGE RESERR ; ERROR IF ANY PARAMETER WAS SPECIFIED. 1/31/73 MOV #BFBLCK,-(SP) ; COMM. BLOCK ADDRESS EMT 30. ; INITIALIZE DIRECTORY FOR BFUP TST BFBLCK ; ERROR? BNE RESERR ; YES RTS PC ; ; DELETE THE BATCH FILE TO GET MORE DATA SPACE ******** ; FC40 ; NO - USE DELETED ENTRY THEN. ******** MOV R3,R0 ; YES MOV R0,LENGTH(R1) ; SET LENGTH IN REQUEST JMP DEFA27 ; USE ALLOCATOR'S STUFF DEFC40 = . ASR R2 ; FILE TYPE DEFC42 = . ; ******** TST SORTLN ; DID WE FIND ANYTHING? BEQ ERRB08 ; NO- ERROR TYPE 8 - CAN'T DEFINE ;  * ; * PURPOSE: * ; * --KEEPS 24-HOUR CLOCK AND PERPETUAL CALENDAR UPDATED. * ; * --CALLS THE SCHEDULER ONCE A MINUTE, ON THE MINUTE. * ; * * ; * USAGE: * ; * TRIGGERED BY TIME-OF-DAY CLOCK INTERRUPT. * ; * IF TIME OR DATE IS TURN WILL BE MADE, BUT THE EXIT FROM PASS 2 WILL BE MADE. ;ROUTINE WILL NOT REJECT ILLEGAL COMMANDS ABOVE [6], BUT WILL ;INSTEAD MIS-INTERPRET THEM FOR ONE OF THE LEGAL ONES. JSR PC,NXTBLK ;GET NEXT OBJECT MODULE BLOCK BR LODJ98 ;NO MORE BLOCKS: EXIT PASS 2 MOV R0,R1 ;POINTER TO DATA MOV R5,R0 ;BYTE COUNT MOV (R1)+,R2 ;GET BLOCK COMMAND SUB #2,R0 ;COUNT  ******** DELBCH = . ; ******** BGE RESERR ; ERROR IF ANY PARAMETER WAS SPECIFIED. 1/31/73 MOV #$BCHID,DELBID ; SET BATCH FILE'S ID IN DELETE BLOCK. ******** ; MOVB #200!$BCHTP,DELBTP ; SET CORE RES., BATCH FILE TYPE1/31/73 MOV #DELBLK,-(SP) ; PUT ADD. OF DEL. BLOCK ONTO STACK ******** EMT 52 ; GO CALL ON DELETE ********  ; FILE WITH LENGTH REQUESTED .IFNZ DRESDI MOV #DEFC50,IOCOMP ; I/O COMPLETE ADDRESS MOVB #UDLEV,DLVL ; SET LEVEL 1 FOR UPDATE MOVB #4.,IOFCN ; UPDATE DISC I/O FUNCTION MOV NEWSS,RLSECT ; SECTOR SAVED DURING SEARCH MOV #DLIST,-(SP) ; DISC I/O LIST TO STACK JSR PC,PFRITE ; START DIRECTORY UPDATE RTS PC ;WAIT FOR I/O COMPLETE ; ;  ALTERED BY OUTSIDE PROGRAM(S), * ; * CPU MUST BE ON LEVEL 7 TO AVOID INTERFERENCE. * ; * WHEN READING TIME OR DATE, SAME PRECAUTION SHOULD * ; * BE TAKEN. * ; * PROGRAMMER: 52 * ; * VERSION:004.003 * ; * DATE: 13-APR-72 * ; *  OFF TWO BYTES FOR COMMAND SUB #2,R2 ;DISCARD COMMANDS BELOW 3. BLE GETBLK ;IGNORE THEM AND GET NEXT BLOCK BIC #-3-1,R2 ;CHANGE 4 (MND=4+2) TO ZERO ASL R2 ;BYTE TO WORD INDEX ADD R2,(SP) ;BUMP RTN ADDR APPROPRIATELY RTS PC .PAGE ; ******************************************************************** LODJ22: ;PROCESS NEXT RLD COMMAND MOV #ABSREL, RTS PC ; ALL DONE ******** ; ******** .ENDC ; ******** DELBLK: .WORD 1 ; THREAD WORD ******** .BYTE 0,0 ; 0-ERROR CODE; 1-ERROR TASK ******** .WORD 0 ; SYSTEM USE ******** DELBID: .WORD $BCHI FIRST I/O COMPLETE FOR UPDATE OF DELETED ENTRY ; DEFC50 = . MOV FMFRST,R1 ; GET CURRENT PARAMETER LIST JSR PC,TSTDER ; TEST FOR DISC ERROR .ENDC MOV SCHIDX,R3 ; ADDRESS OF ENTRY TO MODIFY MOV SCTR(R3),NEWSS ; GET NEW START SECTOR FOR DEF. ADD SORTLN,SCTR(R3) ; UPDATE DELETED ENTRY'S START SECTOR SUB SORTLN,LGTH(R3) ; UPDATE DELETED ENTRY'S LENGTH .IFNZ DRESDI  * ; * G U L F E L E C T R O N I C S Y S T E M S * ; ******************************************************************** SAVE = $SAVE ;OP-CODE FOR CALL TO [SAVE] SUBROUTINE STRTWD = 4 ;INDEX TO MODULE TIME& DATE WORD DELTA = 6 ;INDEX TO MODULE INCREMENT WORD .DEF CALEND .DEF QSKED,DQSKED,COUNTR .DEF DAYTAB,CLOCK,TICTOC,SECOND,MINABSVAL ;INIT TO RELOCATABLE. (SEE [PTGLOB] MOVB (R1)+,R2 ;GET RLD COMMAND (NEGATIVE IF BYTE RELOC MOV R2,R4 ;WILL USE UNSIGNED COMMAND FOR INDEX BIC #-177-1,R4 ;LEAVE ONLY COMMAND: NO SIGN MOVB (R1)+,R3 ;OFFSET FROM TEXT COMMAND BEQ LODJ24 ;ZERO OFFSET IS A DUMMY SUB #4,R3 ;ADJ OFFSET DUE TO "TXT" CMD & "PC" WORD LODJ24: MOV R3,OFFSET ;NOW IS OFFSET FROM FIRST WORD OD ; FILE ID. ******** DELBTP: .WORD 0 ; FILE TYPE (NOT SET FOR DELETE) 1/31/73 ; .WORD 0 ; LENGTH (NOT NEEDED FOR DELETE) 1/31/73 ; ******** ; ; ; RESET ALL OVERLAY TASK TABLES TO UNUSED CONDITION ; TSKINI = . BGE RESERR ; ERROR IF ANY PARAMETER WAS SPECIFIED. 1/31/73 MOV #OVTMIN,R0  MOV #DEFC60,IOCOMP ; CHANGE I/O COMPLETE ADDRESS RTS PC ; RETURN ; ; SECOND I/O COMPLETE FOR UPDATE OF DELETED ENTRY ; DEFC60 = . MOV FMFRST,R1 ; CURRENT REQUEST LIST JSR PC,TSTDER ; TEST FOR DISC ERROR .ENDC MOV SORTLN,LENGTH(R1) ; SET LENGTH FOUND IN LIST JMP DEFA28 ; CREATE NEW FILE'S ENTRY ; ; DETERMINE IF LENGTH IN DELETED ENTRY AFFORDS ENOUGH UTE,HOUR .DEF JDATE,MDAY,MONTH,YEAR,MXDAYS,JANARY,FEBARY .DEF SWAITB,STBPTR,THDTAB,CURTHD,ABMPLR,SKDBSY .REF PUSHR,POPR,PPTAB,ABORT .REF QUEUE,FIRST,LAST,$PRIOR,RESTOR,$CTASK .REF TSTAT,TSOVLY,DSPTCH .REF ACTIVE .TITLE CALEND .PAGE CALENDAR: ;TIME & DATE ROUTINE ;ENTRY FROM TIME-OF-DAY CLOCK INTERRUPT ;ENTERED ON CPU LEVEL F TEXT ADD TXTPTR,R3 ;ACTUAL BUFFER ADDRESS TO LOCATE TEXT MOV PTSECT,R5 ;POINTER TO SECTION ENTRY IN LSD CMP R4,#CMDMAX ;IS COMMAND WITHIN LEGAL RANGE? BGT LDER20 ;ILLEGAL COMMAND TST ASWICH ;SET TO IGNORE "ASECTS"? BEQ LODJ26 ;NO - O.K. TO GO THROUGH CMP R4,#7 ;ALLOWED TO PROCESS TYPE 7 "PC" CMD ONLY BNE LODJ60 ;IGNORE REST OF RLD BLOCK ; UPDATE 1/6/73 TIMERS.C01 ; UPDATE TIMERS.S36 06.21.72 ; UPDATE 4/13/72 TIMERS ;UPDATE: 8-FEB-72 ; ******************************************************************** ; * MODULE IDENTIFICATION: T I M E R S * ; ******************************************************************** ; ******************************************************************** ; * Q T I M E ; ROOM TO DEFINE A NEW FILE. ; DEFD00 = . CMP R0,LGTH(R3) ; ENOUGH ROOM FOR REQUEST BGT DEFC30 ; NO-KEEP LOOKING MOV R0,SORTLN ; YES- SET REQUIRED LENGTH IN HIT WORD MOV R3,SCHIDX ; SAVE IT'S INDEX INTO SEARCH BUFFER .IFNZ DRESDI MOV RLSECT,NEWSS ; SAVE RELATIVE SECTOR IN WHICH FOUND .ENDC BR DEFC42 ; CONTINUE WITH GOOD NEWS. ******** ;  ; SET BYTE BASE INDEX INTO TASK TABLES MOV #OVTMIN+OVTMIN,R1 ; SET WORD INDEX TIA10: MOVB #6,TSTAT(R0) ; DISABLE TASK CLRB IOSTAT(R0) ; CLEAR THE I/O STATUS CLRB TPRTY(R0) ; CLEAR THE PRIORITY MOV #1,HEADER(R1) ; SET HEADER TO NON-EXISTENT TST (R1)+ ; BUMP TO NEXT WORD INC R0 ; AND TO NEXT BYTE CMP R0,#TASMAX ; DONE? BLE TIA10 ; NO TIA LODJ26: ASL R4 ;MAKE WORD INDEX JMP @LODJ29(R4) ;GO TO PROPER COMMAND ROUTINE .PAGE LODJ29: .WORD LDER20,CMD1,CMD2,CMD3,CMD4,CMD5,CMD6,CMD7,CMD8,CMD9 .WORD CMD2,LDER20,CMD4,CMD5,CMD6 ;THESE ARE .CSECT COMMANDS CMDMAX = .-LODJ29/2-1 LODJ98: JMP LODL00 ;END OF PASS 2: GO WRITE LOAD FILE ; ******************************************************************* LDER20: MOV #20,R4 ;ILLEGAL TEXT-MODIFICATION * ; * PROGRAM IDENTIFICATION: "QTIME" * ; * TIMER MODULE QUEUEING SUBROUTINE * ; * * ; * PURPOSE: LOADS TIMER MODULES ONTO "WAIT" STACK FOR "TIMER" * ; * "TMNSRT" IS RESPONSIBLE FOR UNLOADING FROM THE STACK * ; * AND STRINGING ONTO PROPER THREAD * ; * 7 .IFNZ OVRLAY CLRB SVSWCH ;SWITCH CLOSED IF "SAVE" CALLED EARLY .ENDC OVRLAY .IFNZ $ABMPL ;OPTION FOR "ABORT" MULTIPLIER DEC ABMPLR ;COUNT DOWN THE ABORT MULTIPLIER BGT CALA08 ;NOT YET: DON'T RUN ABORT OR TIME-SLICE MOV #$ABMPL,ABMPLR ;RESET THE ABORT MULTIPLIER .ENDC $ABMPL TST ACTIVE ;DON'T DECREMENT TASK TIMEOUT COUNTER BEQ CALA08  ERRB08 = . MOV #8.,R0 ; REPORT ERROR TYPE 8 JMP ERRB99 ; ; .PAGE ; ; DELETE A FILE ; R1= PARAMETER LIST ADDRESS ; R2= FILE TYPE ; DELA00 = . MOV #IDCLR,NEWSS ; PROCESSES SUBROUTINE FOR DELETE BR DPUA00 ; DO IT ; ; PROTECT A FILE ; R1= PARAMETER LIST ADDRESS ; R2= FILE TYPE ; PRTA00 = . MOV #S COMMAND JSR PC,ERRPRT .PAGE LODJ50: ;MODULE-END BLOCK FOUND: ;MOVE MODULE POINTER "PTROBJ" TO NEXT MODULE NAME IN LSD; ;THEN BRING IN NEXT OBJECT MODULE MOV PTROBJ,R2 ;CURRENT MODULE NAME IN LSD ADD #5,R2 ;POINT TO FLAGS BYTE LODJ52: ADD #BPSYM,R2 ;NEXT ENTRY CMP R2,SYME ;HIT LSD END? BHIS LODJ98 ;*****END OF LSD: NORMAL END OF PASS 2***** CMPB 20: .IFNZ NDISCS ; ONLY IF HAVE OVERLAY TASKS. ******** .REF $TKFLS,PFRITE MOV #$TKFLS,-(SP) JSR PC,PFRITE .ENDC RTS PC .END ! ;IF A TASK ISN'T ACTIVE TST COUNTR ;OR IF HIS TIMER COUNTER BEQ CALA08 ;IS ALREADY ZERO DEC COUNTR ;TIC OFF CURRENT TASK TIMER BGT CALA08 ;STILL SOME LIFE LEFT .PAGE .IFNZ $TMSLC ;OPTION FOR TIME SLICING MOV R1,-(SP) ;SAVE USER'S MOV $PRIOR,R1 ;PRIORITY OF TASK INTERRUPTED TSTB PPTAB(R1) ;CHECK FOR TIME-SLICING ON THIS LEVEL "ETP,NEWSS ; PROCESS SUBROUTINE FOR PROTECT BR DPUA00 ; DO IT ; ; UNPROTECT A FILE ; R1= PARAMETER LIST ADDRESS ; R2= FILE TYPE ; UNPA00 = . MOV #CLEARP,NEWSS ; PROCESS SUBROUTINE FOR PROTECT ; ; DO IT ; DPUA00 = . MOV FILEID(R1),R0 ; GET SUBJECT FILE ID NO. .IFZ DRESDI JSR PC,CDSRCH ; DOES FILE EXIST? .ENDC #(R2),#OBJMN ;IS THIS ENTRY AN OBJ MOD NAME? BNE LODJ52 ;NO: KEEP LOOKING SUB #5,R2 ;MOVE BACK TO 1ST BYTE OF ENTRY MOV R2,PTROBJ ;POINTER TO NEXT OBJ MOD ENTRY IN LSD BR LODJ10 ;INIT FOR NEXT MODULE .PAGE LODK10: ;TEXT BLOCK ENCOUNTERED: FIRST TRANSFER IT TO INTERNAL ;BUFFER, THEN GET NEXT BLOCK. IF ANOTHER "TXT", OUTPUT FIRST ;ONE. IF AN "RLD", MODIFY TEXT, BUILD TRAIL%BLE CALA06 ;NOT A T/S LEVEL: GO DO ABORT SEQUENCE .IFNZ OVRLAY CMP $CTASK,#OVTMIN ;IS TASK TO BE TIME-SLICED AN OVERLAY? BLT CALA02 ;NO: A "CORE" TASK MOV (SP)+,R1 ;RESTORE FOR CALL TO "SAVE" CALA01: SAVE ;SWITCH TO SYSTEM STACK AND SAVE REGS MOV $CTASK,R0 ;WILL USE AS INDEX MOVB #1,TSTAT(R0) ;SET TASK STATUS: "IN USE BY OVLY MTR" MOV R4,PS ;DROP CPU & .IFNZ DRESDI JSR PC,DDREAD ; SET UP FOR DISC DIRECTORY READ MOV #DPUA10,IOCOMP ; I/O COMPLETE ADDRESS MOVB #UDLEV,DLVL ; USE DISC UPDATE LEVEL-PRIORITY 1 MOVB #4.,IOFCN ; REQUEST UPDATE MOV CRRSCT,RLSECT ; SET UP RELATIVE SECTOR MOV #DLIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,PFRITE ; START UPDATE OF DIRECTORY MOV (SP)+,PSR ; POP STACK - RTS PC 'ER, THEN OUTPUT TEXT ;IF MODULE END, OUTPUT TEXT BLOCK AND GET ANOTHER MODULE. TST ASWICH ;SWITCH SET TO IGNORE "ASECTS"? BNE LODJ12 ;YES: GO GET NEXT BLOCK SUB #2,R0 ;ADJUST BYTE COUNT... TST (R1)+ ;...AND POINTER FOR "PC" AS 1ST TXT WORD MOV R0,TXTBC ;SAVE TEXT BLOCK BYTE COUNT MOV TXTPTR,R2 ;CURRENT OPEN CELL IN TEXT SAVE BUFFER LODK20: DEC R0 ( .TITLE TASKC ; DCBF .DEF TSCHED ; FIRST WORD OF HEADER ; PARAMETERS DCBF CR = 15 ; DCBF LF = 12 ; DCBF STSIZE = 64. ; # WORDS IN STACK DCBF BFSIZE = 256. ; # WORDS IN BUFFER )LEVEL BEFORE CALL MOV R4,-(SP) ;SAVE PS OF INTERRUPTED PROGRAM JSR PC,TSOVLY ;CALL "TIME-SLIC OVERLAY" ROUTINE MOV #340,PS ;RAISE CPU LEVEL AGAIN BEFORE CLOCK MOVB #2,SVSWCH ;CLOSE SWITCH TO AVOID SECOND "SAVE" ;MAKE SYSTEM STACK LPOK 3C2G5AE5+E7XE-4X7T MOV #RESTOR,-(SP) ;...FROM "RESTOR" TO MAKE RTI WORK BR CALA08 ;SKIP ABORT SEQUENCE CALA02: * ; RETURN TO CALLER-WAIT FOR ; ; I/O COMPLETE ; ; FIRST I/O COMPLETE DURING DELETE, PROTECT OR UNPROTECT ; DIRECTORY UPDATE. ; DPUA10 = . MOV FMFRST,R1 ; ADDRESS OF CURRENT REQUEST JSR PC,TSTDER ; TEST FOR DISC ERROR MOV CRREAD,R3 ; ADDRESS OF ENTRY TST (R3) ; ENTRY DEFINED? .ENDC BEQ ERRC09 ; NO-ERROR TYPE 9 JSR + ;BC TO ZERO? BLT LODK30 ;YES MOVB (R1)+,(R2)+ ;TRANSFER ANOTHER BYTE BR LODK20 ;BACK FOR MORE ; "HIGHPC" REMEMBERS THE HIGHEST VALUE OF PC INTO WHICH TEXT HAS ; BEEN LOADED. IF THE CURRENT TEXT BLOCK HAS ANY TEXT BELOW ; THIS UPPER BOUND, THE TRAILER MUST BE SCANNED FOR ANY POSSIBLE ; RELOCATING INSTRUCTIONS AFFECTING THIS AREA. ANY SUCH ; INSTRUCTIONS MUST BE VOIDED, SINCE NEW TEXT IS BEING LOADED. ; , DCBF ; DCBF ; EMT NUMBERS DCBF $EXIT = 4 ; EXIT DCBF $TYOUT = 13 ; TTYOUT DCBF $TTYIN = 14 ; TTYIN DCBF $DCTAP = 15 ; DECTAPE I/O DCBF $BINAS = 16 - ;(CONTINUE) .ENDC OVRLAY MOV R2,-(SP) ;SAVE USER'S ASL R1 ;USED AS A WORD INDEX MOV FIRST(R1),R2 ;ADDRESS OF FIRST TASK BEQ CALA05 ;NO TASKS IN QUEUE: DON'T SLICE MOV R2,@LAST(R1) ;LINK FRONT TASK TO END OF THREAD... MOV R2,LAST(R1) ;...AND UPDATE THE "LAST" POINTER MOV (R2),FIRST(R1) ;THEN MAKE "FIRST" POINT TO WHAT WAS . PC,@NEWSS ; PERFORM APPROPRIATE FUNCTION .IFNZ DRESDI TSTB FTYPE(R3) ; CORE DIRECTORY ENTRY EXIST? BPL DPUA15 ; NO MOV FILEID(R1),R0 ; GET FILE'S ID JSR PC,CDSRCH ; FIND IT'S ADDRESS JSR PC,@NEWSS ; PERFORM ON IT .ENDC MOV #CDILST,-(SP) ; UPDATE CORE DIR. IMAGE JSR PC,PFRITE ; EXIT 1-IGNORE ERRORS .IFNZ DRESDI DPUA15: MOV #DPUA20,IO/ THE VOIDING IS ACCOMPLISHED BY REPLACING THE "ADD" OR "SUB" ; INSTRUCTION WITH A "BR .+4" INSTRUCTION LODK30: MOV CURPC,R0 MOV R0,R1 ADD TXTBC,R1 DEC R1 ;UPPER BOUND OF CURRENT TEXT BLOCK CMP R0,HIGHPC BHI LODK35 ;CURRENT TEXT IS ABOVE ANY PREVIOUS MOV TRASEC,-(SP) ;SAVE NUMBER OF CURRENT TRAILER SECTOR MOV TRSCSV,R5 ;NUMBER OF FIRST TRAILER SECTOR MOV 0 ; BINARY TO ASCII CONVERSION DCBF $DSKIO = 23 ; DISCIO DCBF $NCHKP = 30 ; NO CHECKPOINTS DCBF $BFINT = 36 ; BFINIT DCBF $BFENT = 37 ; BFENTR DCBF $BFCLS = 41 ; BFCLOSE DCBF $RADPK = 46 ; RAD50 PACK 1 ;THE SECOND TASK IN QUEUE CLR @LAST(R1) ;ZERO THREAD WORD OF NEW LAST TASK CALA05: ;EXIT FROM TIME-SLICE MOV (SP)+,R2 ;RESTORE USER'S MOV (SP)+,R1 ;LIKEWISE BR CALA08 ;BYPASS ABORT SEQUENCE CALA06: ;HERE WHEN LEVEL IS NOT A SLICER: DO ABORT==> MOV (SP)+,R1 ;RESTORE USER'S .ENDC $TMSLC ; ABORT SEQUENCE: TASK'S ABORT COUNTER REACHED ZERO (@TIMA402COMP ; CHANGE I/O COMPLETE ADDRESS RTS PC ; RETURN ; ; SECOND I/O COMPLETE DURING DELETE, PROTECT OR UNPROTECT ; DIRECTORY UPDATE ; DPUA20 = . MOV FMFRST,R1 ; ADDRESS OF CURRENT REQUEST JSR PC,TSTDER ; TEST FOR DISC ERROR JSR PC,GFTYPE ; GET FILE TYPE .ENDC JMP DEFB00 ; FINISHED PROCESSING REQUEST ; ; IDCLR IS THE PROCESS SUBROUTINE THAT WILL DELETE 3 TRAPCSAVE,R4 ;PC OF FIRST RELOCATION INSTRUCTION CMP R5,(SP) ;FIRST TRAILER SECTOR STILL BEING BUILT? BEQ LODK32 ;AVOID R/W IF SO LODK31: JSR PC,TRAILIO ;WRITE OUT CURRENT SECTOR CLRB TRAR.W ;READ MOV R5,TRASEC JSR PC,TRAILIO ;READ IN (NEXT) SECTOR INCB TRAR.W ;PREPARE FOR WRITE LODK32: MOV #TRAILBLOCK+2,R3 ;PTR TO LOCAL BUFFER LODK33: MOV R4,R2 4 DCBF $DEFIN = 51 ; DEFINE A ROS FILE DCBF .PAGE DCBF ; TASK 16. - TRANSFER A SPECIFIED DOS CONTIGIOUS FILE INTO A BFUP DCBF ; ELEMENT OF THE SAME NAME. ASSUME .OBJ/TYPE 0 DCBF TSCHED = . ; HEADER LABEL FOR ROS/DOS DECBFUP:.WORD 1 ; THREAD WORD OF TASK HEADER. DCBF .WORD START ; START ADDRESS 5) MOV $CTASK,-(SP) ;STACK CURRENTLY ACTIVE TASK'S NUMBER... JSR PC,ABORT ;...AND REQUEST ITS ABORTION CLR -(SP) ;NOW ON SYSTEM STACK... MOV #DSPTCH,-(SP) ;...SO SET IT UP TO RETURN PROPERLY CALA08: ;HERE WHEN READY TO RUN THE CLOCK DECB TICTOC ;# OF TICS PER SECOND BEQ CALA10 ;NEW SECOND CALA09: RTI ;USED AS RETURN ALSO FROM[CALA40] .PAGE CA6; AN ENTRY IN A DIRECTORY. ; R3= ADDRESS OF ENTRY ; IDCLR = . CLR (R3) ; SET ID TO DELETE STATUS .IFNZ $TMSLC!CHKPTC MOVB FTYPE(R3),R2 ; GET ENTRY'S FILE TYPE BIC #177600,R2 ; ISOLATE BITB #100,FSTAT(R2) ; CHECKPOINT FILE TYPE BEQ IDC010 ; NO ADD LGTH(R3),LGTH(R3) ; YES-DOUBLE LENGTH CLR CKSAVE(R3) ; RESET-CHECKPOINT START ADDRESS7;VALUE OF PC IN TRAILER (AFTER FETCH) ADD (R3),R2 ;RELATIVE ADDRESSING TO TEXT WORD CMP R2,R0 ;DOES IT FALL WITHIN CURRENT TEXT RANGE? BLO LODK34 ;BELOW IT CMP R2,R1 BHI LODK34 ;ABOVE IT MOV #401,-2(R3) ;VOID WITH "BR .+4" INSTRUCTION LODK34: CMP (R3)+,(R3)+ ;BUMP BOTH BUFFER POINTER... CMP (R4)+,(R4)+ ;...AND TRAILER PC CMP R3,#TRAILBLOCK+126. 8 DCBF .WORD 0,0 ; NO INIT. ADD. OR MAX. TIME. DCBF .BYTE STSIZE ; STACK SIZE DCBF .BYTE PRIBKG ; RUN AT BACKGROUND PRIORITY LEVEL. DCBF .WORD 0 ; CURRENT TIME DCBF .IFNZ ARG ; DCBF .WORD 0 ; PASSED ARGUMENT, IF ANY. DCBF .ENDC 9LA10: ;ON EACH SECOND COME HERE CLRB SKSWCH ;INIT TO RUN "SKNSRT" AND NOT "SKED" MOV R0,-(SP) MOV R1,-(SP) MOV #CLOCK,R0 ;POINTER TO TIME & DATE BYTES MOVB #TICRES,(R0)+ ;RESET [TICTOC] INCB (R0) ;NEXT SECOND CMPB (R0),#60. ;NEW MINUTE? BLT CALA40 ;NO: BUT GO TO END TO RUN "SKNSRT" INCB SKSWCH ;SET TO RUN "SKED" AND N: .ENDC IDC010: RTS PC ; RETURN ; ; SETP IS THE PROCESS SUBROUTINE THAT WILL SET THE PROTECT ; BIT IN AN ENTRY IN A DIRECTORY. ; R3=ENTRY ADDRESS ; SETP = . BISB #200,PDVCE(R3) ; SET PROTECT STATUS BIT RTS PC ; RETURN ; ; CLEARP IS THE PROCESS SUBROUTINE THAT WILL RESET THE ; PROTECT BIT IN AN ENTRY IN A DIRECTORY ; R3 = ENTRY ADDRESS ; CLEARP = . ; ;REACHED END OF BUFFER? BLOS LODK33 ;NOT YET INC R5 ;ADVANCE TO NEXT SECTOR CMP R5,(SP) ;IF SECTOR JUST FINISHED WAS THE SECTOR ; THAT WAS BEING CREATED WHEN WE ENTERED, LEAVE IT IN CORE. BLE LODK31 ;ELSE WRITE IT OUT AND READ NEXT ONE IN TST (SP)+ ;POP SAVE OF CURRENT SECTOR # LODK35: CMP R1,HIGHPC ;SEE IF WE MUST UPDATE HIGHEST PC BLOS LODK36 < ; DCBF .BYTE $OVTYP ; CPU LEVEL & OVERLAY TASK FILE TYPE. DCBF .BYTE $TKCNO ; TASK NUMBER DCBF .WORD 0 ; STACK POINTER DCBF .WORD 202 ; LAST STACK WORD AND OVR TASK FILE ID. DCBF .=.+STSIZE+STSIZE-2 ; RESERVE STACK FOR TASK DCBF ; =OT "SKNSRT" CLRB (R0)+ ;RESET [SECOND] & GO ON TO... INCB (R0) ;...BUMP [MINUTE] CMPB (R0),#60. ;NEW HOUR? BLT CALA40 ;NO: BUT GO RUN SCHEDULER CLRB (R0)+ ;RESET [MINUTE]... INCB (R0) ;...AND BUMP [HOUR] CMPB (R0),#24. ;NEW DAY? BLT CALA40 ;NO CLRB (R0)+ ;YES: RESET [HOUR]... INC (R0) > BICB #200,PDVCE(R3) ; RESET PROTECT STATUS BIT RTS PC ; RETURN ; ; .PAGE ; ; ERROR HANDLING LOGIC ; ERRA00 = . INC (R1) ; SET LIST THREAD WORD BACK AGAIN MOV (SP)+,PSR ; RESET LOCKOUT PRIORITY 1/23/733 JSR PC,REPERR ; REPORT ERROR JSR R5,POPR ; RESTORE REGISTERS 1/6/73 MOV (SP)+,(SP) ; PUT RETURN IN PROPER? MOV R1,HIGHPC LODK36: CLR TSWICH ;INDICATE FIRST TXT BLCOK JSR PC,GETBLK ;GET NEXT NON-GSD BLOCK BR LODK40 ;"MODULE-END" BR LODK50 ;"TEXT" BR LODK38 ;"RLD" BR LODK36 ;ISD: IGNORE LODK38: JMP LODJ22 LODK40: ;TEXT FOLLOWED BY MODULE - END MOV #2,TSWICH ;PUT OUT TEXT: THEN GET NEW MODULE BR LODK52 ;GO OUTPUT TEXT @ DCBF ; VARIABLES DCBF NXTBLK: .WORD 0 ; NEXT TAPE BLOCK TO READ. DCBF LSTBLK: .WORD 0 ; LAST DECTAPE BLOCK IN FILE. DCBF EXT: .WORD 0 ; RAD50 FILE EXT. NAME. DCBF ; DCBF ; CONSTANTS DCBF ROBJ: .RAD50 /OBJ/ A;...AND BUMP [JDATE] CMP (R0),(PC)+ ;NEW YEAR? MXDAYS: .WORD 0 ;HOLDS #DAYS IN CURRENT YEAR BLE CALA30 ;NO: GO TO NEXT DAY + MAYBE NEW MONTH ;HAPPY NEW YEAR!! MOV #1,R1 MOV R1,(R0)+ ;RESET [JDATE] MOVB R1,(R0)+ ;RESET [MONTH] MOVB R1,(R0)+ ;RESET [MDAY] INCB (R0) ;BUMP TO NEW YEAR MOVB #28.,FEBARY ;RESETB PLACE ON STACK RTS PC ; RETURN TO REQUESTOR ; ; ; .IFNZ DRESDI ; ONLY IF HAVE DISK DIRECTORIES 1/6/73 ; ; TEST FOR DISC ERROR ; R1 = PARAMETER LIST ADDRESS ; TSTDER = . TST DERRWD ; DISC ERROR OCCUR? BNE ERRB15 ; YES-REPORT RTS PC ; NO-RETURN ; ERRB15 = . TST (SP)+ ; POP RETURN PC OFF STACK MOCLODK50: ;TEXT FOLLOWED BY TEXT MOV #1,TSWICH ;INDICATE MORE TEXT AFTER OUTPUT THIS 1. LODK52: JMP LODJ60 ;GO OUTPUT UN-MODIFIED TEXT BLOCK ; ******************************************************************** LDER21: MOV #21,R4 ;FINAL MODULE BLOCK NOT MODULE END JSR PC,ERRPRT .PAGE LODJ30: CMD1: ;INTERNAL SYMBOL: ADD SECTION BASE TO LOCAL OFFSET - ;"ADD BIAS" INSTRUCTION INTO TRAILER MOV D ; DCBF .PAGE DCBF ; TABLES FOR DEC FILE READER DCBF ; DCBF ; MICS. BLOCKS DCBF ; DCBF ; BFUP BLOCK E FEBRUARY MOV #365.,MXDAYS ;RESET YEAR LENGTH BITB #3,(R0) ;IS THIS A LEAP YEAR? BNE CALA35 ;NO INC MXDAYS ;YES: BUMP YEAR LENGTH INCB FEBARY ;...AND FEBRUARY BR CALA35 CALA30: ;HERE @ BEGIN OF DAY & NOT NEW YEAR MOV #MONTH,R1 ;INIT POINTER TO DATE BYTE TABLE MOVB (R1)+,R0 ;[MONTH]: USED AS INDEX INCB (R1) FV #15.,R0 ; REPORT ERROR TYPE 15- DISCIO ERROR .ENDC ; 1/6/73 ; ERRB99 = . JSR PC,REPERR ; REPORT ERROR ERRBXX: JSR PC,GFTYPE ; GET REQUEST'S FILE TYPE JMP DEFB05 ; FINISH REQUEST ; ; ERRC09 = . MOV #9.,R0 ; REPORT ERROR TYPE 9 JSR PC,REPERR ; DO IT .IFZ DRESDI BR ERRBXX .ENDC G(R1)+,R4 ;LOCAL VALUE ADD BASE(R5),R4 ;CALC OFFSET FROM LOAD MODULE BASE JSR PC,ADDPUT ;PUT WORD IN TEXT AND "ADD" INTO TRAILER SUB #4,R0 ;BC BR LODJ99 LODJ32: CMD2: ;GLOBAL RELOCATION: OFFSET FROM LOAD BASE INTO TEXT - ;"ADD" INTO TRAILER (SUPPRESSED IF GLOBAL IS ABSOLUTE) MOV R1,R4 ;POINTS TO GLOBAL NAME CMP (R1)+,(R1)+ ;BUMP PTR PAST NAME JSR PC,SH DCBF BFUPBK: .WORD 0 ; ERROR CODE, IF ANY. DCBF .WORD $BCHID ; FILE ID DCBF BFNAM1: .WORD 0 ; FIRST HALF OF ELEMENT NAME DCBF BFNAM2: .WORD 0 ; SECOND HALF OF NAME. DCBF .BYTE 0 ; BFUP USE. DCBF BFTYPE: .BYTE 0 ; ELEMENT TYPE DCBF BFSTRT: .WORD 0 I ;[MDAY]: NEW DAY CMPB (R1),DAYTAB(R0) ;[MDAY]: END OF MONTH BLE CALA40 ;NO MOVB #1,(R1) ;RESET DAY TO FIRST OF MONTH INCB -(R1) ;NEXT MONTH: CAN'T BE JANUARY (ABOVE) CALA35: ;HERE TO ADJUST THE THREAD POINTER POINTER AT THE BEGIN ; OF EACH MONTH. "CURTHD" ALWAYS POINTS TO "TH1BGN" DURING ; ODD-NUMBERED MONTHS, AND TO "TH2BGN" DURING EVEN MONTHS. MOV #THDTAB,CURTHD ;INIT J .IFNZ DRESDI MOV #ERRCX9,IOCOMP ; CHANGE I/O COMPLETE ADDRESS RTS PC ; RETURN TO DISCIO ; ERRCX9 = . MOV FMFRST,R1 ; GET REQUESTS ADDRESS BR ERRBXX ; FINISH REQUEST ; .ENDC ; ; ; CDSRCH WILL PERFORM A CORE DIRECTORY SEARCH FOR ; THE FILE ID FOUND IN R0. IF R0=0, THEN IT WILL ; SEARCH FOR AN AVAILABLE ENTRY. ; R0 = FILE ID ; R1 = PARAMKRGLOB ;SEARCH FOR NAME IN LSD JSR PC,ADDPUT ;PUT WORD IN TEXT AND "ADD" INTO TRAILER SUB #6,R0 ;BC LODJ99: JMP LODJ20 ;COMMON RETURN (GET NEXT RLD COMMAND) LODJ34: CMD3: ;INTERNAL DISPLACED RELOCATION: ;DISPLACEMENT FROM CURRENT PC INTO TEST - ;"SUB BIAS" INSTRUCTION INTO TRAILER JSR PC,GETPCR ;GET PC AS OFFSET FROM RELOCATABLE ZERO NEG R4 ADD (R1)+,R4 L ; ELEMENT START SECTOR DCBF BFLNTH: .WORD 0 ; LENGTH OF ELEMENT. DCBF ; DCBF ; FILE DEFINE BLOCK DCBF DFNLST: .WORD 1 ; THREAD WORD DCBF .WORD 0 ; BYTE 0-ERROR CODE, BYTE 1 ERROR TASK. DCBF .WORD 0,$BCHID,$BCHTP ; RESERVED, BATCH FILE ID, BATCH FILE MTHREAD-START TABLE POINTER BITB #1,MONTH ;ODD-NUMBERED MONTH? BNE CALA40 ;YES: LEAVE AS IS ADD #2,CURTHD ;EVEN: ADVANCE TO POINT TO THREAD #2 CALA40: ;HERE ON EVERY MINUTE BOUNDARY TO RUN... ;...THE SCHEDULER. ON THE OTHER 59 SECONDS, RUN "INSERT" ROUTINE. MOV (SP)+,R1 ;RESTORE USER'S FOR "SAVE" MOV (SP)+,R0 ;ALSO INCB SKDBSY ;MARK AND TEST BUSY FLAG BEFORE NETER LIST ADDRESS ; UPON RETURN: ; R3 = ADDRESS OF ENTRY IF FOUND ; = 0, ENTRY NOT FOUND ; R4 = IFD OF ENTRY IF FOUND ; CONDITION CODES SET ON R3 ; ; NOTE: USES REGISTER 5 (R5) AS A WORK REGISTER. ; THIS SUBROUTINE IS ALSO CALLED BY ; COMPRS AND FLIST ; CDSRCH = . CLR R4 ; INITIALIZE IFD COUNTER MOV #-NCRLOC,R3 ; USED AS INDEX THRU CORE O ;FORM (L-(.+2)) JSR PC,SUBPUT ;PUT WORD IN TEXT AND "SUB" INTO TRAILER SUB #4,R0 ;BC BR LODJ99 ;NEXT .PAGE LODJ36: CMD4: ;GLOBAL DISPLACED RELOCATION: ;DISPLACEMENT FROM CURRENT PC INTO TEXT ;"SUB" IN TRAILER ONLY IF GLOBAL IS ABSOLUTE; I.E., MONITOR SYMB JSR PC,GETPCR ;GET PC AS OFFSET FROM RELOCATABLE ZERO MOV R4,R5 ;SAVE IT MOV R1,R4 P DCBF DFNLNG: .WORD 0 ; TYPE, GET MAX. ROOM. DCBF ; I/O LISTS DCBF DTLIST: .WORD 1 ; THREAD WORD DCBF .BYTE 5 ; ALWAYS UNIT #0 DCBF .BYTE 2 ; EXIT TYPE DCBF .WORD 0 ; NO I/O COMPLETE DCBF .BYTE 0 ; QENTERING BNE CALA09 ;LOG-JAM: SCHEDULER CURRENTLY RUNNING... ;...DON'T RE-ENTER: IT WILL CLEAN UP AFTER ITSELF. ; O.K. TO ENTER "SKNSRT" OR ""SKED". .IFNZ OVRLAY SVSWCH: BR .+2 ;OR [.+6] IF "SAVE" ALREADY CALLED (@CALA01) .ENDC OVRLAY SAVE ;SAVE REGS OF INTERRUPTED PGM & RTN HERE .IFNZ OVRLAY BR SKSWCH ;SKIP STACK-POP CMP (SP)+,(SP)+ ;POP "RETURN-TO-RESTOR" WORDS (@CALA02) R; ; RESIDENT DIRECTORY. TST R0 ; HAVE WE BEEN REQUESTED TO GET IFD? 1/6/73 BPL CDSR10 ; NO. 1/6/73 MOV R0,R4 ; YES. FIRST GET INDEX ALONE. 1/6/73 BIC #100000,R4 ; WISH WE HAD A SIGN CLEAR. 1/6/73 MOV R4,R5 ; ALSO PUT COUNT HERE TO START CAL. OF 1/6/73 MUL #10.,R5 ; OFFSET INTO TAS ;PTR TO GLOBAL NAME CMP (R1)+,(R1)+ ;BUMP PAST NAME JSR PC,SRGLOB ;SEARCH FOR GLOBAL SUB R5,R4 ;GET DISPLACEMENT SUB #ABSREL,ABSVAL ;INVERT SENSE OF ABSOLUTE FLAG JSR PC,SUBPUT ;INSERT "SUB" ONLY IF ABSOLUTE SUB #6,R0 ;BC BR LODJ99 ;NEXT RLD LODJ38: CMD5: ;GLOBAL ADDITIVE RELOCATION: ;PUT SUM OF CONSTANT & GLOBAL (OFFSET::0) INTO TEXTNO ERROR TASK DCBF DTFUN: .BYTE 0 ; FUNCTION (READ) DCBF DTERR: .WORD 0,0 ; ERROR CODE, RESERVED DCBF .WORD TBUFF ; ADDRESS OF DATA BUFFER DCBF DKLIST: .WORD 1 ; THREAD WORD DCBF .BYTE 1 ; UNIT NUMBER DCBF .BYTE 2 ; EXIT TYPE DCBFU .ENDC OVRLAY SKSWCH: BR .+2 ;SWITCH NORMALLY OPEN TO FALL THROUGH... BR SKRELY ;...TO SKIP "SKED" AND RUN "SKNSRT" ; ON THE MINUTE IT IS CLOSED TO FORCE RUN OF "SKED" INSTEAD. .PAGE SKED: ;THIS IS THE SCHEDULER ;ENTER HERE EVERY MINUTE ON THE MINUTE FROM "CALENDAR" MOV @CURTHD,R0 ;[TH1BGN] OR [TH2BGN] MOV R0,R1 ;SAVE CURRENT THREAD ADDRESS FOR... VBLE FOR THE GIVEN IFD. 1/6/73 ADD R5,R3 ; ADD OFFSET TO BASE ADDRESS. 1/6/73 BR CDSR35 ; AND GO FINISH UP. 1/6/73 CDSR10: CMP R0,DOD+NCRLOC(R3) ; SEARCH CORE DIRECTORY FOR MATCH BEQ CDSR30 ; FOUND IT? CDSR20: INC R4 ; BUMP IFD ADD #10.,R3 ; BUMP INDEX BNE CDSR10 ; TRY AGAIN ; CLR R3 ; SET NOT FOUND - ALREADY ZEWT; ;"ADD" INTO TRAILER (SUPPRESSED IF GLOBAL IS ABSOLUTE) MOV R1,R4 ;PTR TO GLOBAL NAME JSR PC,SRGLOB ;SEARCH LSD FOR IT CMP (R1)+,(R1)+ ;BUMP PAST GLOBAL TO CONSTANT ADD (R1)+,R4 ;CONST + XSYM JSR PC,ADDPUT ;PUT WORD IN TEXT AND "ADD" INTO TRAILER SUB #8.,R0 ;BC BR LODJ99 ;NEXT RLD LODJ40: CMD6: ;GLOBAL ADDITIVE DISPLACED: X .WORD 0 ; NO I/O COMPLETE DCBF .BYTE 0,NDPRT1 ; NO ERROR TAK, LOWEST DISK PRIORITY LEVDCBF DKERR: .WORD 0,0 ; ERROR CODE, RESERVED DCBF .WORD DBUFF ; ADDRESS OF DATA BUFFER KBLIST: .WORD 1 ; THREAD WORD DCBF .BYTE 0,2 ; UNIT NUMBER, EXIT TYPE DCBF .WORD 0 ; NO I/O COMPLETE Y ;...POSSIBLE MODULE REMOVAL (BELOW) MOV (R0),R0 ;NEXT MODULE'S ADDRESS BEQ SKDEX2 ;END OF THREAD: EXIT MOV R4,PS ;DROP CPU LEVEL TO BE FAIR TO OTHERS MOV STRTWD(R0),-(SP);STACK THIS MODULE'S START WORD FOR... JSR PC,UNPACK ;...CALL TO UNPACK SUBROUTINE, WHICH ; RETURNS WITH TIME & DATE OF MODULE'S START WORD SPREAD ON STACK ; (SP) = DAY OF MONTH 2(SP) = HOUR 4(SP) = MINUTE CMPBZRO IF HERE. 1/6/73 RTS PC ; RETURN CDSR30: TST R0 ; SEARCHING FOR AVAILABLE ENTRY BEQ CDSR40 ; YES CDSR35: ; 1/6/73 MOVB DOD+NCRLOC+PDVCE(R3),R5 ; NO-GET LOG. DEVICE OF FILE BIC #177600,R5 ; ISOLATE CMPB R5,SYSTEM+1(R1) ; SAME AS CALL'S DEVICE? BNE CDSR20 ; NO-KEEP LOOKING CDSR40: ADD #DOD+NCRLOC,R3[ ;SUM OF CONST & GLOBAL, LESS CURRENT OFFSET, TO FORM ;DISPLACEMENT TO PUT INTO TEXT; ;"SUB" IN TRAILER ONLY IF GLOBAL IS ABSOLUTE; I.E., MONITOR SYMB JSR PC,GETPCR ;GET PC AS OFFSET FROM RELOCATABLE ZERO MOV R4,R5 ;SAVE IT MOV R1,R4 ;GLOBAL NAME PTR JSR PC,SRGLOB ;SEARCH FOR NAME IN LSD CMP (R1)+,(R1)+ ;BUMP PAST NAME TO CONST ADD (R1)+,R4 ;C+XSYM \ DCBF .BYTE 0,1 ; NO ERROR TASK, LOW PRIORITY DCBF .WORD 0,0 ; ERROR CODE, RESERVED DCBF KBADD: .WORD 0 ; DATA BUFFER ADDRESS DCBF .PAGE DCBF ; I/O BUFFERS DCBF DBUFF: .WORD $BCHID ; BFUP DISK FILE ID NUMBER DCBF .WORD 400,0,0,] (SP),MDAY ;SEE IF MODULE IS FOR TODAY BGT SKDEX1 ;FOR TOMORROW OR BEYOND: EXIT BLT SKDB10 ;FOR YESTERDAY OR EARLIER: EXECUTE MODULE CMPB 2(SP),HOUR ;TODAY: THIS HOUR? BGT SKDEX1 ;MODULE IS EARLY: EXIT BLT SKDB10 ;MODULE IS LATE: EXECUTE CMPB 4(SP),MINUTE ;FOR THIS HOUR. THIS MINUTE? BGT SKDEX1 ;TOO SOON SKDB10: MOV #340,PS ;LOCK OUT INTERF^ ; ADDRESS OF ENTRY FOUND RTS PC ; RETURN TO CALLER WITH GOOD NEWS. ; ; .IFNZ DRESDI ; ; DDREAD WILL CALCULATE THE SECTOR ON WHICH A FILE ; ENTRY RESIDES RELATIVE TO THE BEGINNING OF THE ; DISC RESIDENT DIRECTORY. IT WILL CALCULATE THE ; ADDRESS OF THE ENTRY IN "BUFFER" AND ALSO THE ; DOD ON WHICH THE ENTRY IS PART OF. ; R0= FILE ID ; R1= PARAMETER LIST ADDRESS ; UPON RETURN: ; _ SUB R5,R4 ;C+XSYM-PC= DISPLACEMENT SUB #ABSREL,ABSVAL ;INVERT SENSE OF ABSOLUTE FLAG JSR PC,SUBPUT ;INSERT "SUB" ONLY IF ABSOLUTE SUB #8.,R0 ;BC BR LODJ99 ;NEXT RLD LODJ42: CMD7: ;SET CURRENT PC AND POINT TO NEW SECTION ;IF .ASECT, THE CONSTANT WILL BE THE NEW PC, AND ITS ;BASE WILL BE ZERO. ;IF .CSECT, THE CONSTANT WILL REPRESENT THE OFFSET FROM `0 ; USE SPECIFIED SECTOR, WRITE, RESERVED DCBF TBUFF: ; TAPE BUFFER DCBF BLKSEC: .WORD 0 ; SECTOR OR BLOCK NUMBER TO TRANSFER. DCBF .WORD BFSIZE ; NUMBER OF WORDS TO TRANSFER. DCBF BUFFER: .=.+BFSIZE+BFSIZE ; RESERVE THE 1 BLOCK BUFFER. DCBF .EVEN DCBF MES1: .WORD MES1LN,0 ; NUMBER OF CHARACTERS, RESERVED. aERENCE FROM "DQSKED" ADD #6,SP ;POP "START" WORD CMP (R0),#1 ;ALREADY DE-QUEUED? BNE SKDB20 ;STILL O.K. BR SKED ;...AND GO BACK FOR ANOTHER ONE SKRELY: BR SKNSRT ;RELAY POINT FOR SKIP TO 'INSERT' RTNE .PAGE SKDB20: ;O.K. TO WORK ON THIS MODULE MOV (R0),(R1) ;FIRST: REMOVE MODULE BY "BRIDGING" THE ;THREAD OVER ITSELF, CONNEb CRRSCT CONTAINS RELATIVE SECTOR OF THE DOD ; CRREAD CONTAINS ENTRY ADDRESS IN "BUFFER" ; DEVNO CONTAINS LOGICAL DEVICE (IN I/O LIST) ; DBUF CONTAINS APPROPRIATE DOD ID (IN I/O LIST) ; REGISTERS ARE VOLITILE. ; DDREAD = . DEC R0 ; CALCULATE (FILE ID #-1)/12 CLR CRRSCT ; USE AS RELATIVE SECTOR COUNTER DDR010: SUB #12.,R0 ; DIVIDE BY 12 TO FIND BMI DDR020 c ;THAT SECTION'S BASE. MOV R1,R4 ;PTR TO SECT NAME SOUGHT CMP (R1)+,(R1)+ ;BUMP TO CONSTANT JSR PC,GETSEC ;SEARCH FOR SECTION NAME IN LSD BR LDER23 ;NOT FOUND MOV R4,PTSECT ;PERM PTR TO SECT NAME IN LSD... MOV R4,R5 ;...ALSO CURRENT PTR SUB #4,R0 ;BC (MORE BELOW) CLR ASWICH ;"ASECT" SWITCH: PREPARE CMP 4(R5),#4d DCBF .BYTE CR,LF ; DCBF .ASCII "ENTER FILE/ELEMENT NAME: " DCBF MES1LN =.-MES1-4 ; DCBF .EVEN DCBF MES2: .WORD 6,0 ; DCBF MES2BF: .ASCII / / ; DCBF MES3: .WORD MES3LN,0 eCTING PREVIOUS ;MODULE WITH FOLLOWING ONE MOV #1,(R0) ;SET THIS MODULE INACTIVE... MOV R4,PS ;...DROP CPU LEVEL TO INTERRUPTED LEVEL MOV R0,R1 ;...AND SET UP THE SECONDARY MODULE PNTR MOV 2(R1),R2 ;GET OPTION & TASK WORD BPL SKDC10 ;"R" REPEAT FLAG NOT SET MOV DELTA(R1),-(SP) ;GET REPEAT WORD & STACK IT FOR CALL... JSR PC,UNPACK ;.f ; RELATIVE SECTOR OF DIRECTORY INC CRRSCT ; ACCUMULATE RELATIVE SECTOR BR DDR010 ; DO MORE DDR020: ADD #12.,R0 ; BUMP BACK REMAINDER MOV R0,R3 ASL R0 ; PERFORM ASL R0 ; MULTIPLICATION ADD R0,R3 ; BY 5 ADD R3,R3 ; DOUBLE FOR WORD ADDRESSING ADD #BUFFER,R3 ; ACTUAL ADDRESS OF ENTRY IN BUFFER g10 ;IS THIS AN "ASECT"? BNE LODJ44 ;NO-O.K. TO CONTINUE INC ASWICH ;SET TO FORCE IGNORE OF ALL "ASECT" TEXT ; CONTINUE AS IN "CMD8" .PAGE LODJ44: CMD8: ;MODIFICATION TO PC: ".=.+C" ;BUMP PC BY ADDING NEW CONST TO CURRENT PGM SECT BASE MOV BASE(R5),R4 ;CURRENT SECTION'S BASE ADD (R1)+,R4 ;ADD CONSTANT TO BASE VALUE ADD #LDBYTS,R4 ;KEEP OFFSET DUE TO INSERTED LEAh ; DCBF .BYTE CR,LF ; DCBF .ASCII /FILE NOT FOUND, REENTER: / DCBF MES3LN =.-MES3-4 ; DCBF .EVEN DCBF MES4: .WORD MES4LN,0 ; DCBF .BYTE CR,LF ; i..TO SPREAD IT ON STACK JSR PC,ADDNOW ;ADD CURRENT TIME TO STACKED TIME TST (R1)+ ;BUMP POINTER TO ALLOW FOR "DELTA" WORD MOV R0,-(SP) JSR PC,QSKED ;RE-QUEUE MODULE IN NEW TIME SLOT TST (SP)+ ;POP RETURN ERROR WORD SKDC10: ;CONTINUE PROCESSING MODULE... ;...WHETHER OR NOT IT WAS REPEATED TSTB R2 ;TASK NUMBER BEQ j MOV R3,CRREAD ; SAVE IT MOVB SYSTEM+1(R1),R3 ; GET LOGICAL DEVICE OF REQUEST MOVB R3,DEVNO ; SET IN LIST ASL R3 ; WORD INDEX MOVB PHYDEV(R3),DBUF ; CALCULATE ID OF APPROPRIATE INC DBUF ; DOD TO USE FOR REQUEST RTS PC ; RETURN .ENDC ; ; ; ; CREATE WILL BUILD A FILE DIRECTORY ENTRY ; R1= REQUEST LIST ADDRESS ; R2= kDER WRDS MOV R4,CURPC ;NEW VALUE OF NEXT TEXT BLOCK'S BASE ;(AS OFFSET FROM LOAD MODULE'S BASE) CLR TXTBC ;AVOID ALTERING NEW [CURPC] IN "TXTOUT" SUB #4,R0 ;2 WDS FOR CMD8; 4 WDS FOR CMD7 ; PC COMMANDS MUST BE LAST IN RLD BLE LODJ99 ;DONE: O.K. ; IF NOT DONE, THEN NEXT COMMAND MUST ALSO BE PC TYPE CMPB #PCMD1,(R1) ;IS NEXT COMMAND "PC DEFINITION"? BEQ lDCBF .ASCII /FILE NOT CONTIGIOUS, REENTER: / DCBF MES4LN =.-MES4-4 ; DCBF .EVEN DCBF MES5: .WORD MES5LN,0 ; DCBF .BYTE CR,LF ; DCBF .ASCII /FILE TRANSFERED, NEXT: / DCBF MES5LN =.-MES5-4 ; m SKDD10 ;NO QUEUEING WHEN IT IS ZERO MOVB R2,-(SP) ;STACK TASK # IN PREP FOR CALL TO QUEUE .IFNZ DPRTY ;OPTION FOR DYNAMIC PRIORITIES CLR -(SP) ;USE SYSTEM-ASSIGNED PRIORITIES .ENDC DPRTY CLR -(SP) ;IMMEDIATE RETURN REQUESTED... ;...OR INIT OF [ARG] IF NEEDED ASL R2 ;IS THE "A" (ARGUMENT) FLAG SET? BPL SKDC20 ;NO: LEAVE TnFILE TYPE ; R3= DIRECTORY ENTRY ADDRESS ; NEWSS= START SECTOR OF FILE ; CREATE = . MOV FILEID(R1),(R3) ; SET FILE ID IN ENTRY MOV NEWSS,SCTR(R3) ; SET START SECTOR IN ENTRY MOVB SYSTEM+1(R1),PDVCE(R3) ; SET LOGICAL DEVICE NO. MOVB R2,FTYPE(R3) ; SET FILE TYPE .IFNZ DRESDI TSTB FLTYPE(R1) ; CORE DIRECTORY REQUESTED BPL CRE010 ; NO .ENDC BIo LODJ99 ;YES: O.K. CMPB #PCMD2,(R1) ;IS IT "PC MODIFICATION"? BEQ LODJ99 ;YES: O.K. BR LDER24 ;PC COMMAND NOT LAST IN RLD .PAGE LODJ46: CMD9: ;SET PROGRAM LIMITS CLR R4 ;LOW PROGRAM (RELATIVE) ADDRESS JSR PC,ADDPUT ;PUT IT IN TEXT AND AN "ADD" IN TRAILER ADD #2,OFFSET ;BUMP TO NEXT TEXT WORD MOV PRSIZE,R4 ;FIRST AVAILABLE ADDRESS ABOVEp DCBF .EVEN DCBF MES6: .WORD MES6LN,0 ; DCBF .BYTE CR,LF ; DCBF MES6BF: .ASCII / ERROR - VALUE / DCBF MES6VL: .ASCII / / DCBF .ASCII /. TASK DID $EXIT./ DCBF qHE ZERO ON STACK FOR ARG'MNT .IFNZ ARG ;OPTION FOR TRANSMITTING ARGUMENT MOV @6(R1),(SP) ;YES: PUT ACTUAL ARG IN PLACE OF ZERO .ENDC ARG TST (R1)+ ;BUMP POINTER IN ANY CASE IF "A" IS SET SKDC20: .IFNZ ARG ;OPTION FOR TRANSMITTING ARGUMENT CLR -(SP) ;PUSH RETURN CODE .ENDC ARG JSR PC,QUEUE ;NOW CALL "QUEUE" TO RUN REQUESTED TASK TST (SP)+ rSB #200,FTYPE(R3) ; YES-SET C-STATUS BIT CRE010: MOV LENGTH(R1),LGTH(R3) ; SET FILE'S LENGTH IN ENTRY .IFNZ $TMSLC!CHKPTC BITB #100,FSTAT(R2) ; IS A CHECKPOINT AREA REQUIRED? BEQ CRE020 ; NO MOV NEWSS,CKSAVE(R3) ; YES- CALCULATE START SECTOR ADD LGTH(R3),CKSAVE(R3) .ENDC CRE020: RTS PC ; RETURN TO CALLER ; ; GFTYPE WILL GET AND ISOLATE THE FILE TYPE ; FROM A FLMGMT REs PROGRAM JSR PC,ADDPUT ;STICK IT IN,TOO, WITH TRAILER "ADD" BR LODJ99 ; ******************************************************************* LDER23: MOV #23,R4 ;SECTION NAME SEARCH FAILURE JSR PC,ERRPRT LDER24: MOV #24,R4 ;FATAL ERROR: PC CMD NOT LAST IN RLD JSR PC,ERRPRT .PAGE LODL00: ;NOW DONE WITH PASS 2: OUTPUT ANY REMAINING TEXT, THEN ; OUTPUT THE TRAILER. FIX UP MONITOR tMES6LN =.-MES6-4 ; DCBF .EVEN DCBF .PAGE DCBF START: EMT $NCHKP ; IF TASK IS BEING RUN AS AN OVERLAY TASDCBF MOV #MES1,KBADD ; REQUEST FILE/ELEMENT NAME. DCBF JSR PC,TTYOUT ; DCBF STA100: MOV #MES2BF+6,R0 ; GET ADDRu ;...AND POP ERROR CODE ON RETURN SKDD10: ;QUEUEING OR NO, NOW CHECK FOR FLAG-SET ASL R2 ;IS THE "F" FLAG OPTION SET? BPL SKED ;NO: THIS MODULE DONE: BACK FOR MORE BISB 8.(R1),@6(R1) ;YES: DO [IOR] OF MASK INTO FLAG LOC'N BR SKED ;DONE WITH MODULE: LOOK FOR MORE SKDEX1: ADD #6,SP ;ADJUST SP FROM CALL TO "UNPACK" SKDEX2: ;SCHEDULER EXIT WITH NO STvQUEST ; R1= REQUEST'S LIST ADDRESS ; UPON RETURN: ; R1 = UNCHANGED ; R2= FILE TYPE ; GFTYPE = . MOVB FLTYPE(R1),R2 ; GET FILE TYPE BIC #177600,R2 ; ISOLATE RTS PC ; RETURN ; ; ; ; REPERR IS A FLMGMT INTERNAL SUBROUTINE USED TO REPORT ; ERROR INFORMATION. ; R0 = ERROR TYPE ; R1 = PARAMETER LIST ADDRESS ; REPERR = . wTASK TABLES; EXIT. MOV #64.,TXTCNT ;WANT TO WRITE ONLY ONE SECTOR MOVB #1,TXTR.W ;WRITE JSR PC,TEXTIO ;GO READ OR WRITE WITH"TXTLST" MOV #207,@TRAILPOINTER ;[RTS PC] INTO FINAL TRAILER WRD JSR PC,TRAILIO ;WRITE OUT FINAL TRAILER SECTOR MOV TRSCSV,TXTSEC ;INIT TO READ IN FIRST TRAILER SECTOR CLRB TXTR.W ;READ JSR PC,TEXTIO ;GO READ OR WRITE WITH"TXTLST" xESS OF INPUT BUFFER DCBF MOV #" ,R1 ; GET 2 BLANKS IN R1 DCBF MOV R1,-(R0) ; BLANK THE INPUT BUFFER DCBF MOV R1,-(R0) ; DCBF MOV R1,-(R0) ; DCBF MOV R0,-(SP) ; SAVE IT ON THE STACK FOR EMT RAD50 PK.DCBF MOV #MES2,KBADD ; PUT BUFFER ADD IN I/O LIST DCBF yACK POP MOV #340,PS ;PROTECT CHECK OF BUSY FLAG MOVB #-1,SKDBSY ;RESET FLAG TO ALLOW NEXT ENTRY JMP RESTOR ;RETURN TO INTERRUPTED PGM ==>[RESTOR] .PAGE SKNSRT: ;ROUTINE TO INSERT SCHEDULER MODULES FROM THE WAITING ;TABLE. ALSO LOOP RE-ENTRY POINT FROM END MOV #340,PS ;LOCK OUT INTERFERENCE FROM "QSKED" SKNA10: ;LOOP RETURN WHEN LOCKOUT IS ALREADY SET MOV @STBPTz MOVB R0,ERROR(R1) ; SET ERROR TYPE IN LIST MOVB ERRTSK(R1),-(SP) ; TASK NO. TO STACK BEQ REPE10 ; NONE .IFNZ DPRTY CLR -(SP) ; USE PRIORITY IN TASK TABLE .ENDC .IFNZ ARG MOV R1,-(SP) ; SEND FLMGMT LIST ADDRESS AS AN ARGUMENT .ENDC CLR -(SP) ; IMMEDIATE RETURN REQUESTED JSR PC,QUEUE ; QUEUE ERROR TASK REPE10: TST (SP)+ { .PAGE MOV TRAPC,R0 ;BYTES IN PROGRAM PLUS TRAILER ASR R0 ;# WORDS ADD #LEDWDS,R0 ;12-19-72 MOV R0,R1 ;# OF WORDS REQUIRED ON DISC ;12-19-72 ADD #PHDSZE,R0 ;# OF WORDS REQUIRED IN CORE ;12-19-72 CLRB R0 ;GETTING # OF PAGES SWAB R0 ;# CORE "PAGES" -1 INC R0 ;# O| MOV #KBLIST,-(SP) ; I/O LIST ADDRESS FOR EMT DCBF EMT $TTYIN ; GET ELEMENT NAME DCBF CMP (R0),R1 ; IF STILL BLANKS, EXIT SINCE ALL DONE. DCBF BNE STA110 ; DCBF EMT $EXIT ; RETURN TO ROS. DCBF STA110: MOV #BFNAM1,-(SP) ; PUT NAME'S ADD ON STACK FOR RAD50 CONVDCBF EMT $RADPK ; }R,R0 ;GET ADDRESS OF NEXT MODULE BEQ SKDEX2 ;TABLE EMPTY: EXIT VIA "RESTOR" SUB #2,STBPTR ;NOT EMPTY: POP POINTER BACK ONE CELL MOV #1,(R0) ;SET INACTIVE IN CASE DE-QUEUED BIT #10000,2(R0) ;WAS IT DE-QUEUED WHILE IN TABLE? BNE SKNA10 ;YES: IGNORE AND CONTINUE MOV R4,PS ;RESTORE PREVIOUS CPU LEVEL MOV 4(R0),-(SP) ;STACK MODULE'S DATE WORD FOR... JS~ ; IGNORE ERROR RTS PC ; RETURN ; ; .PAGE ; INIDSC = . .WORD 1 ; THREAD WORD .WORD INITD ; ENTRY POINT .WORD 0,0 .BYTE STKSZ ; STACK SIZE .BYTE 1 ; RUN AT PRIORITY 1 .WORD 0 .IFNZ ARG .WORD 0 .ENDC .BYTE 0 .BYTE $INITD ; TASK NUMBER .WORD 0 F CORE PAGES ASHC #-6,R1 ; ROTATE R1 (DIV BY 64) ******** BIT #176000,R1 ; DID PRGM END ON A SECTOR BOUNDARY? ******** BEQ 2$ ; YES - NO NEED TO ... ******** INC R1 ; ALLOW FOR PARTIAL SECTOR ******** 2$: BIC #176000,R1 ; LEAVE # SECTORS OCCUPIED ******** BIT #3,R1 ; IF FINAL SECTOR IA A MUTIPLE OF 4 ********  DCBF MOV ROBJ,EXT ; ASSUMED FILE NAME EXTENSION OF .OBJ DCBF CLRB BFTYPE ; ASSUMED ELEMENT TYPE OF 0. DCBF MOV #102,NXTBLK ; SET NEXT BLOCK FOR UID DIR BLOCK DCBF STA120: JSR PC,GETBLK ; GET THE BLOCK DCBF MOV #BUFFER,R0 ; GET ADDRESS OF DATA BUFFER. DCBF MOV (R0)+,NXTBLK ; GET BLOCK # OF NEXT TAPE BLOCK IN CHAIDCBF STA130: CMP R PC,UNPACK ;...CALL TO SPREAD IT ON STACK BIT #4000,2(R0) ;IS THE "C" (CURRENT) BIT ON? BEQ SKNA15 ;NO: INTERPRET START WORD NORMALLY BIC #4000,2(R0) ;AVOID USING "C" FLAG ON A RE-QUEUE JSR PC,ADDNOW ;GO ADD "START DELAY" TO CURRENT TIME BR SKNA40 ;BYPASS NORMAL INTERPRET OF "START" SKNA15: CMP 4(SP),#77 ;IF "MIN" IS ALL ONES... BNE SKNA20 MOVB MINUTE,4(SP) ; STACK POINTER .=.+STKSZ+STKSZ ; RESERVE SPACE FOR STACK ; ; ; ; FILE SIZE TABLE ; FLSIZE = . .WORD $FS000 .WORD $FS001 .WORD $FS002 .WORD $FS003 .WORD $FS004 .WORD $FS005 .WORD $FS006 .WORD $FS007 .WORD $FS008 .WORD $FS009 .WORD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; RESERVE ROOM FOR BLANK ; ; F ; READING WITH PHDSZE OFFSET WILL CAUSE ******** ; IT TO OVERFLOW INTO FOLLOWING PAGE. ******** BNE 4$ ; ******** INC R0 ; BUMP # OF PAGES REQ'D SINCE LAST SECTO******** ; WILL OVERFLOW TO NEXT PAGE. ******** 4$: MOV R0,-(SP) ; SAVE IT FOR USE BELOW. ******** MOV R1,DFL (R0)+,BFNAM1 ; DOES FIRST HALF OF NAME MATCH? DCBF BNE STA140 ; NO. DCBF CMP (R0)+,BFNAM2 ; YES. DOES SECOND HALF? DCBF BNE STA150 ; NO. DCBF CMP (R0)+,EXT ; YES. DOES THE EXTENSION? DCBF BNE STA160 ; NO. DCBF TST (R0) ; YES. IS IT A CONTIGI ;...THEN USE CURRENT MINUTE SKNA20: CMP 2(SP),#37 ;IF "HOUR" IS ALL ONES... BNE SKNA30 MOVB HOUR,2(SP) ;...THEN USE CURRENT HOUR ;IF "CURRENT HOUR" WAS SPECIFIED, BUT... ; ...A SPECIFIC MINUTE WAS CALLED (RATHER THAN THE CURRENT MINUTE),... ; ...AND IT IS EARLIER THAN THE CURRENT MINUTE, WE WILL AUTOMATICALLY... ; ...INCREMENT THE HOUR. THIS AVOIDS QUEUEING HIM FOR AN EARLIER TIME ; WHICH WOULD PUT HIM IN THE "FUTURE" QUEUILE TYPES .=FLSIZE+$FTMAX+$FTMAX ; USE ONLY SPACE NEEDED ; ; ; TTYLST = . .WORD 1 ; THREAD .BYTE 0 ; DEVICE 0 .BYTE 1 ; EXIT TYPE .WORD 0 .BYTE 0 .BYTE 1 ; PRIORITY OUTPUT .WORD 0,0 .WORD TTYBUF ; BUFFER ADDRESS ; TTYBUF = . .WORD 28. ; NO. OF CHARACTERS IN OPERATOR MESSAGE .WORD IST+10. ; SET # SECTORS INTO DEFINE BLOCK. ******** MOV PRSIZE,R1 ASR R1 ;WORDS IN PGM ONLY ADD #LEDWDS+PHDSZE,R1 ;# WORDS IN PGM PLUS HEADER CLRB R1 ;256 WORDS/PAGE [PDP-11/20] SWAB R1 ;# PAGES -1 (EXCLUDING TRAILER) INC R1 ;# PAGES (EXCLUDING TRAILER) SUB R1,R0 ;# PAGES FREE TO RELEASE AFTER RELOCAT'N SWAB R1 BISB OUS FILE? DCBF BMI STA135 ; YES. WE HAVE FOUND IT. DCBF MOV #MES4,KBADD ; NO. ERROR MESSAGE AND TRY OVER. DCBF JSR PC,TTYOUT ; DCBF BR STA100 ; DCBF STA135: CMP (R0)+,(R0)+ ; BUMP DIR. POINTER TO START BLOCJ. DCBF BR STA200 ; GO DO THE TRANSFER DCBF STA140: TST (RE. WE ASSUME THIS IS WHAT HE ; HAD IN MIND WHEN SETTING UP THE MODULE. HE CAN FORCE HIMSELF INTO THE ; "FUTURE" THREAD BY SPECIFYING A SPECIFIC HOUR RATHER THAN CURRENT. CMPB 4(SP),MINUTE BGE SKNA30 ;MINUTE IS NOW OR LATER: O.K. TO USE INC 2(SP) ;BUMP HOUR: RUN AT REQUESTED MINUTE NEXT HOUR SKNA30: TST (SP) ;IF "DATE" = 0,... BNE SKNA40 MOVB MDAY,(SP) ;...THEN USE TODAY'S DATE .PAGE SKNA40:  0 ; RESERVED FOR TTYI/O .ASCII /ROS DISC SYSTEM INITIALIZED/ .BYTE 15 ; CARRIAGE RETURN ; ; .PAGE INITD = . JSR PC,MASK ; LOCK-OUT ALL OTHER TASKS MOV #-$FTMAX-$FTMAX,R0 ; INDEX FOR LOOP CLR R1 ; USED TO ACCUMULATE FNEXT'S MOV FLSIZE,R2 ; USE TO ACCUMULATE DEC R2 ; FLAST'S INIA10: MOV R1,FNEXT+$FTMAX+$FTMAX(RR0,R1 ;BYTE 0 = # PAGES TO RELEASE... MOV #TXTBK1,R0 MOV R1,(R0)+ ;...BYTE 1 = FIRST FREE PAGE MOV #240,(R0) ;NOP KEEPS BOUNDARY @ MULTIPLE OF 4. INCB TXTR.W ;WRITE JSR PC,TEXTIO ;GO READ OR WRITE WITH"TXTLST" .PAGE ;NOW DEFINE A "ROS" FILE FOR THE LOAD MODULE, OUTPUT IT, AND INIT ; THE NECESSARY TABLES TO RUN THE FILE AS AN OVERLAY TASK. ; FIRST,MAKE ALL NECESSARY CHECKS BEFORE CRE0)+ ; ADJUST DIR. POINTER DCBF STA150: TST (R0)+ ; ADJUST DIR. POINTER DCBF STA160: ADD #12.,R0 ; BUMP R0 TO NEXT DIR. ENTRY. DCBF CMP R0,#BUFFER+BFSIZE+BFSIZE-2 ; DONE WITH BLOCK? DCBF BLT STA130 ; NO. MORE TO COME. DCBF TST NXTBLK ; YES. FIRST OR SECOND BLOCK? DCBF BNE STA120 ; GET NEXT BLOCK.  ;NOW THAT MODULE'S TIME IS READY, BEGIN SEARCH FOR ITS ;PLACE IN ONE OF THE TWO SCHEDULER THREADS. MOV CURTHD,R1 ;POINTS TO [THDTAB] OR [THDTAB+2] CMPB (SP),MDAY ;MODULE DATE :: TODAY'S DATE BGT SKNA60 ;AFTER TODAY: USE CURRENT THREAD BLT SKNA50 ;BEFORE TODAY: USE "FUTURE" THREAD CMPB 2(SP),HOUR ;MODULE HOUR :: CURRENT HOUR BGT SKNA60 ;LATER TODAY: USE CURRENT TH0) ; SET FNEXT THIS TYPE MOV R1,FINIT+$FTMAX+$FTMAX(R0) ; SET INITIAL VALUE THIS TYPE MOV R2,FLAST+$FTMAX+$FTMAX(R0) ; SET FLAST THIS TYPE ADD FLSIZE+$FTMAX+$FTMAX(R0),R1 ; CALCULATE NEXT FNEXT ADD #2,R0 ; BUMP REGISTER BGE INIA20 ; FINISHED ADD FLSIZE+$FTMAX+$FTMAX(R0),R2 ; CALCULATE NEXT FLAST BR INIA10 ; DO FOR REST OF TABLE INIA20: MOV FLAST,FNEXT ; SET TYPE 0 FULATING TASK: MOV #30,R4 ;INIT ERROR NUMBER MOV BFSECT,TXTSEC ;SET TO READ IN TASK HEADER INFO CLRB TXTR.W ;READ JSR PC,TEXTIO ;GO READ OR WRITE WITH"TXTLST" MOVB HEDBGN+HTASK,R1 ;TASK # CMP R1,#TASMAX ;WITHIN LIMITS? BGT LDER30 ;OUTSIDE TASK LIMITS CMP R1,#OVTMIN BLT LDER30 MOVB HEDBGN+HPRIOR,R2 ;PRIORITY CMP R2,# DCBF MOV #MES3,KBADD ; LAST BLOCK. ERROR. GIVE ,ESSAGE DCBF JSR PC,TTYOUT ; DCBF BR STA100 ; TRY AGAIN. DCBF .PAGE DCBF STA200: ; HERE FOR ACTUAL TRANSFER DCBF CLR DFNLNG ; INSURE ALWAYS ASK FOR MAX FILE SIZE. DCBF MOV #DFNLST,READ BLT SKNA50 ;WAS EARLIER TODAY: PUT IN "FUTURE" CMPB 4(SP),MINUTE ;MODULE MINUTE :: CURRENT MINUTE BGE SKNA60 ;NOW OR WITHIN HOUR: CURRENT THREAD SKNA50: TST (R1)+ ;WE ARE PAST MODULE'S TIME: USE "FUTURE" SKNA60: ;NOW THAT PROPER THREAD BEGIN WORD'S ADDRESS IS IN R1, ;WE CAN BEGIN SEARCH OF THAT THREAD. MOV (R1),R2 ;ADDR OF ONE OF THE THREAD-BEGIN WORDS BR SKNBL AS IT SHOULD ; ; ALWAYS BE. MOV FLAST,FINIT MOV #AULIST,-(SP) ; LIST ADDRESS TO STACK JSR PC,PFRITE ; DO IT-IGNORE PROCESSING ERROR ; ; OTHER THAN DISCIO PRINTOUT INIA25: CMP #1,AULIST ; I/O COMPLETE BNE INIA25 ; SPIN UNTIL COMPLETE ; ; NOTE: CAN DO SINCE MASKED MOV #FILE,R0 ; ADDRESS OF CORE DIRENPRIOR ;PRIORITY LEGAL? BGT LDER31 ;ILLEGAL PRIORITY TSTB PPTAB(R2) ;IS THIS A TIME-SLICE PRIORITY? BLE LODL06 ; NO. TST HEDBGN+HMAXEQ ;YES - EXECUTION TIME MUST BE SPECIFIED BLE LDER32 LODL06: ASL R2 ;GET WORD INDEX TO BLOCK-SIZE TABLE MOV BSZTAB-2(R2),R3 ;GET MAX ALLOWED # OF "PAGES" W/SIGN MOV R3,R5 ;SAVE FOR SIGN BIC #100000,R3-(SP) ; MAKE SURE THE ROS FILE IS DEFINED. DCBF EMT $DEFIN ; DCBF MOV #BFUPBK,-(SP) ; MAKE SURE THE FILE IS SET UP FOR BFUP.DCBF MOV (SP),-(SP) ; SAVE ADDRESS FOR NEXT CALL. DCBF EMT $BFINT ; DCBF EMT $BFENT ; THEN ENTER THE ELMENT INTO THE DIRECTODCBF TST BFUPBK ; ANY ERRORS? 00 ;ENTER LOOP FOR FIRST TIME SKNB10: ;THIS IS THE LOOP RETURN POINT AS LONG AS SEARCH CONT'S ADD #6,SP ;POP STACK POINTER FROM "UNPACK" BELOW SKNB00: ;HERE FOR FIRST-TIME ENTRY MOV R2,R1 ;SAVE OLD T/W ADDRESS MOV (R2),R2 ;GET NEXT MODULE'S (T/W) ADDRESS BEQ SKNB30 ;AT END OF THREAD ;NOT @ END: TEST MODULE FOR TIME MOV 4(R2),-(SP) ;STACK TEST MODULE'S DCTORY USER AREA INIA26: CLR (R0)+ ; CLEAR USER'S AREA OF CORE DIR. CMP R0,#CDEND ; FINISHED? BLT INIA26 ; NO MOV #CDILST,-(SP) ; PUT INITIALIZED CORE DIR. IMAGE JSR PC,PFRITE ; ON DISC INIA27: CMP #1.,CDILST ; I/O COMPLETE? BNE INIA27 ; SPIN UNTIL COMPLETE ; ; NOTE: CAN DO SINCE MASKED .IFNZ DRESDI MOV #-128.,R0  ;LEAVE ONLY # OF PAGES CMP (SP),R3 ;ACTUAL PROGRAM SIZE :: MAX ALLOWED BLE 10$ ; PROG. SIZE OK. ******** MOV #34!100000,R4 ; SIZE TOO LARGE FOR PRIORITY - ******** JSR PC,ERRPRT ; ERROR IS NOW A WARNING - NOT FATAL. ******** MOV #30,R4 ; RESET ERROR # BASE VALUE. 1/30/73 10$: ; ********  DCBF BNE STA290 ; YES DCBF MOV BFSTRT,R1 ; GET START SECTOR OF BFUP ELEMENT DCBF MOV (R0)+,NXTBLK ; SET FIRST TAPE BLOCK TO READ. DCBF TST (R0)+ ; BUMP DIR BLK POINTER TO END BLOCK #. DCBF MOV (R0),LSTBLK ; AND SAVE THE VALUE FOR LATER USE. DCBF STA220: JSR PC,GETBLK ; GET A TAPE BLOCK. DCBF INC NXTBLK ATE WORD... JSR PC,UNPACK ;...FOR CALL TO SPREAD IT ON STACK CMP 6(SP),(SP) ;NEW MOD'S DATE :: TEST MOD'S DATE BGT SKNB10 ;LATER: KEEP LOOKING BLT SKNB20 ;EARLIER: THREAD NOW CMP 10(SP),2(SP) ;NEW MOD'S HOUR :: TEST MOD'S HOUR BGT SKNB10 ;STILL LATER BLT SKNB20 ;EARLIER CMP 12(SP),4(SP) ;COMPARE MINUTES BGT SKNB10 .PAGE SKNB; INDEX TO CLEAR BUFFER INIA30: CLR BUFFER+128.(R0) ; SET BUFFER ADD #2,R0 ; EQUAL BLT INIA30 ; ALL ZEROS MOVB #1.,DEXIT ; USE EXIT TYPE 1 MOVB #UDLEV,DLVL ; USE DISC PRIORITY 1 MOVB #1.,IOFCN ; SET FUNCTION TO WRITE CLR R1 ; INDEX THRU PHYDEV INIA40: MOV PHYDEV(R1),R2 ; GET A PHYSICAL DEVICE DESCRIPTOR BMI INIA70 ; DEVICE NOT A TST R5 ;IS THIS PRIORITY "DYNAMIC"? BMI LODL20 ;YES: LEAVE AT ACTUAL SIZE MOV R3,(SP) ;REPLACE WITH MAX SIZE FOR FIXED PART'N LODL20: MOV HEDBGN+HSTACK+2,R5 ;FILE I.D. CMP R5,#NDISCS+$SYSFL;MUST BE GREATER THAN SYSTEM RESERVED BLE LDER35 ;FILE I.D. ILLEGAL CMP R5,#MAXID1 ;I.D. MUST BE <= MAX ALLOWED BGT LDER35 MOV R5,DFLIST+6 ;LOAD FILE I.D. INTO ; BUMP BLOCK COUNTER FOR NEXT POINTER. DCBF MOV R1,BLKSEC ; SET DISK SECTOR FOR DISK WRITE. DCBF MOV #DKLIST,-(SP) ; SET UP FOR DISK WROTE DCBF EMT $DSKIO ; AND DO IT. DCBF TST DKERR ; ANY ERRORS? DCBF BNE STA280 ; YES. DCBF ADD #4,R1 ; NO. COUNT # OF SECTORS TRANSFERED. 20: ;HAVE FINALLY FOUND SLOT FOR NEW MODULE. R1 CONTAINS ;ADDR OF PREVIOUS OR "UPSTREAM" MODULE (MIGHT BE THE ;THREAD START WORD) AND R2 CONTAINS ADDR OF DOWNSTREAM ;MODULE, OR ZERO IF NEW MODULE IS BEING PLACED AT END ;OF THREAD. R0 CONTAINS ADDR OF NEW MODULE. ADD #6,SP ;POP SP FROM 1ST CALL TO "UNPACK" SKNB30: ADD #6,SP ;POP SP FROM 2ND CALL TO "UNPACK" MOV R0,(R1) VAILABLE BIC #170377,R2 ; ISOLATE TYPE CMP R2,#400 ; TYPE 1?-DISC DEVICE BNE INIA70 MOVB PHYDEV(R1),DBUF ; DOD FILE ID TO INC DBUF ; INITIALIZE ASR R1 ; LOGICAL DEVICE MOVB R1,DEVNO ; TO LIST CLR RLSECT ; ZERO RELATIVE SECTOR 0 FIRST INIA50: MOV #DLIST,-(SP) ; DISC LIST TO STACK JSR PC,PFRITE ; ZERO 1 SECTOR DISC LIST MOVB HEDBGN+HSTATS,R5 ;REQUESTED FILE TYPE BIC #-177-1,R5 ;RID OF EXTENDED SIGN CMP R5,#$OVTYP ;IS IT LEGAL FOR AN OVERLAY? BEQ LODL22 ;YES LDER37: INC R4 ;ILLEGAL FILE TYPE LDER36: INC R4 ;"DELETE" ERROR LDER35: INC R4 ;ILLEGAL FILE I.D. INC R4 ; ERR 34 (PROG. SIZE TOO LARGE) ******** ; IS NOW DONE DCBF CMP NXTBLK,LSTBLK ; DONE WITH TAPE YEST. DCBF BLE STA220 ; NO. GET NEXT BLOCK. DCBF SUB BFSTRT,R1 ; COMPUTE NUMBER OF DISK SECTORS TRANS. DCBF MOV R1,BFLNTH ; SET INTO BFUP BLOCK. DCBF MOV #BFUPBK,-(SP) ; CLOSE THE ELEMENT. DCBF EMT $BFCLS ; DCBF TST BFUPBK ; AN;LOAD UPSTREAM THREAD-WORD FOR NEW MOD MOV R2,(R0) ;LOAD NEW T/W FOR DOWNSTREAM MOD BR SKNSRT ;GO BACK FOR POSSIBLE MORE MODULES. .PAGE UNPACK: ;INTERNAL SUBROUTINE TO SPREAD A SCHEDULER TIME&DATE ;WORD ONTO THE STACK ;UPON ENTRY, ROUTINE ASSUMES PACKED WORD IS ON TOP OF STACK; ; 15 11 10 6 5 1 ; DAY ^ HOUR ^ MINUTE ;UPON EXIT, STACK HAS THREE WORDS ON IT: ; (SP)= DAY  DIRECTORY INIA55: CMP #1,DLIST ; I/O COMPLETE? BNE INIA55 ; SPIN ; ; NOTE: CAN DO SINCE MASKED INC RLSECT ; GET READY FOR NEXT SECTOR OF ; ; DISC DIRECTORY INITIALIZATION CMP #9.,DERRWD ; DO COMPLETE DIRECTORY YET? BNE INIA50 ; NO-KEEP GOING INIA60: INC R1 ; BUMP LOGICAL DEVICE CMP R1,LOGMAX ; SEARCHEDIN LINE SINCE NON-FATAL. ******** LDER33: INC R4 ;"DEFINE FILE" ERROR LDER32: INC R4 ;MAX XEQ ENTRY ERROR FOR T/S TASK LDER31: INC R4 ;PRIORITY OUTSIDE LIMITS LDER30: ;TASK # OUTSIDE LIMITS JSR PC,ERRPRT ;GO PRINT ERROR AND EXIT .PAGE LODL22: ;READY TO "DEFINE" ROS FILE MOVB HEDBGN+HSTATS,DFLIST+8. ;LOAD FILE TYPE INTO LIST MOV #DFLIST,-(SP) ; ********Y ERRORS? DCBF BNE STA260 ; YES. DCBF MOV #MES5,KBADD ; TELL THE USER DONE. ASK FOR NEXT. DCBF JSR PC,TTYOUT ; DCBF BR STA100 ; GO GET NEXT. DCBF STA260: MOV #"BC,MES6BF ; SET ERROR CODE - BFCLOSE ERROR DCBF BR STA298 ; GO TO COMMON CODE. DCBF  2(SP)= HOUR 4(SP)= MINUTE TST -(SP) ;MUST PUSH STACK TO RE-POSITION (PC) MOV 2(SP),-(SP) ;MOVE (PC) TO NEW PLACE ON STACK MOV 6(SP),R3 ;COPY TIME & DATE WORD FOR USE BELOW MOV R3,R5 ;ALSO SAVE IT FOR BELOW BELOW BIC #177700,6(SP) ;LEAVE "MINUTE" ALL BY ITSELF ASL R3 ASL R3 SWAB R3 ;GET "HOUR" INTO LOW BYTE BIC #177740,R3 ;CLEAR ALL OF PHYDEV? BGT INIB00 ; YES ASL R1 ; WORD INDEX BR INIA40 ; LOOK FOR OTHER DISC DEVICES INIA70: ASR R1 ; LOGICAL DEVICE BR INIA60 ; ; DISC(S) ARE INITIALIZED ; INIB00 = . MOVB #3,DEXIT ; SET BACK EXIT TYPE 3 .ENDC MOV #TTYLST,-(SP) ; TELL OPERATOR FINISHED JSR PC,TTYOUT JMP EXIT ; EXIT FROM TASK EMT DELETE ;FIRST TRY TO DELETE FILE ; ******** MOVB DFLIST+2,R3 ;ERROR BYTE BEQ LODL24 ;O.K. CMP #9.,R3 ;THIS ERROR IS O.K. BNE LDER36 ;ANY OTHER IS AN ERROR LODL24: MOV #DFLIST,-(SP) ; ******** EMT DEFINE ;GO GET FILE DEFINED ; ******** TSTB DFLIST+2 ;ERROR? BNE LDER33 ;YES .PAGE ;*************STA270: MOV #"DT,MES6BF ; DCBF MOV DTERR,-(SP) ; DCBF BR STA299 ; DCBF STA280: MOV #"DK,MES6BF ; DISK ERRORS HERE DCBF MOV DKERR,-(SP) ; DCBF BR STA299 ; DCBF STA290: MOV #"BF,MES6BF ; BFENTER  ALL OTHER STUFF MOV R3,4(SP) ;PUT "HOUR" IN ITS OWN PLACE ON STACK SWAB R5 ASR R5 ASR R5 ASR R5 ;GET [DAY] INTO LOWER BYTE... BIC #177740,R5 ; ...CLEAR GARBAGE... MOV R5,2(SP) ; ...AND PUT IN ITS OWN PLACE RTS PC .PAGE ADDNOW: ;SUBROUTINE TO ADD CURRENT TIME AND DATE TO STACKED. ; NOW THE STACK HAS EITHER A "START" OR "DELTA" WORD SP ; ; EXIT WILL UNMASK TASK LOCKOUT ; .END ** NOW TRANSFER BATCH ELEMENT TO THE ROS FILE************* JSR R5,REGSAV ;NEED TABLE POINTERS BELOW MOV BFSECT,R0 ;INIT RELATIVE READ SECTOR # CLR R1 ;INIT RELATIVE WRITE SECTOR MOV DFLIST+6,R2 ;WRITE FILE I.D. LODL30: CLRB TXTR.W ;SET TO READ MOV R0,TXTSEC ;SET UP READ SECTOR MOV #BTCHID,TXTHED ;SET UP READ I.D. JSR PC,TEXTIO ;GO READ OR WRITE WITH"TXTLST"  * ; * USAGE: CALLED BY ANY ROUTINE WISHING TO ACTIVATE A TIMER * ; * MODULE. CALLING SEQUENCE: * ; * MOV #MODULE,-(SP) ;STACK MODULE'S ADDRESS * ; * MOV TIME,-(SP) ;STACK TIMER-RESET WORD * ; * EMT QTIME ;REQUEST TO QUEUE MODULE * ; * OR * ; * JSR PC,QTIME READ ON IT ; (SP) = DATE 2(SP) = HOUR 4(SP) = MINUTE MOV SP,R5 ;INIT SECONDARY STACK POINTER TST (R5)+ ; AND BUMP OVER THE RETURN ADDRESS. 2/21/7O MOVB MDAY,R3 ;CANNOT ADD BYTES ADD R3,(R5)+ ;STACKED DAY + DELTA DAY MOVB HOUR,R3 ADD R3,(R5)+ ;STACKED HOUR + DELTA HOUR MOVB MINUTE,R3 ADD R3,(R5) ;STACKED MINUTE + DELTA MINUTE ERROR. DCBF STA298: MOV BFUPBK,-(SP) ; DCBF STA299: MOV #MES6VL,-(SP) ; PUT BUFFER ADD FOR 6 CHARACTERS. DCBF EMT $BINAS ; CONVERT ERROR VALUE. DCBF MOV #MES6,KBADD ; ADDRESS OF ERROR MESS. BUFFER. DCBF JSR PC,TTYOUT ; PRINT MESSAGE. DCBF EMT $EXIT ; RETURN TO ROS. DCBF  MOV R1,TXTSEC ;SET UP WRITE SECTOR MOV R2,TXTHED ;WRITE FILE I.D. INCB TXTR.W ;SET TO WRITE JSR PC,TEXTIO ;GO READ OR WRITE WITH"TXTLST" CMPB (R0)+,(R1)+ ;BUMP BOTH SECTOR NUMBERS CMP R0,TRASEC ;HAVE WE PASSED LAST SECTOR? BLE LODL30 ;MORE SECTORS TO GO MOV R1,BFSIZE ;# OF SECTORS USED UP IN LOAD MODULE .PAGE ;************** NOW INIT ALL R * ; * TST (SP)+ ;TEST ERROR RETURN CODE * ; * * ; * THE MODULE MUST BE SET UP, PRIOR TO THE CALL, AS DESCRIBED * ; * IN THE ROS USER'S MANUAL. NOTE THAT CALLS FOR MODULES HAVING * ; * THE "S" SUSPEND OPTION SET WILL CAUSE TRANSFER TO THE * ; * DISPATCHER, AND WILL NOT RETURN UNLESS THE CALL IS IN ERROR. * ; * ON THESE CALLS THE MODULE'S  CMP #60.,(R5) ;SEE IF MINUTES OVERFLOWED BGT ADDN10 ;NO: O.K. SUB #60.,(R5) ;YES: STRIP MODULUS... INC -2(R5) ;...AND BUMP HOURS ADDN10: CMP #24.,-(R5) ;SEE IF HOURS OVERFLOWED BGT ADDN20 ;NO SUB #24.,(R5) ;YES: STRIP MODULUS... INC -(R5) ; ... AND BUMP DAYS 2/21/73 ADDN20: MOVB MONTH,R3 ;USE CURRENT MONTH AS INDEX  .PAGE DCBF ; GETBLK WILL READ IN THE DECTAPE BLOCK SPECIFIED IN THE WORD 'NXTBLK'. DCBF ; NXTBLK IS NOT MODIFIED. DCBF GETBLK =. ; ENTRY POINT DCBF MOV NXTBLK,BLKSEC ; SET BLOCK NUMBER IN I/O LIST. DCBF MOV #DTLIST,-(SP) ; PUT I/O LIST'S ADDRESS ON STACK. DCBF EMT $DCTAP ; DO I/O. ELEVANT TASK AND PRIORITY TABLES ********* JSR R5,REGPOP ;RESTORE TABLE POINTERS ASR R2 ;PRIORITY WAS SHIFTED ABOVE MOVB R2,TPRTY(R1) ;PRIORITY CLRB TSTAT(R1) ;TASK STATUS CLRB IOSTAT(R1) MOVB (SP)+,BSIZE(R1) ;INIT # "PAGES" IN OVERLAY ASL R1 ;NOW A WORD INDEX MOV DFLIST+6,R0 ;INIT FILE I.D. TSTB DFLIST+8. ;WAS AN IFD REQUESTED? BPTASK NUMBER IS AUTOMATICALLY SET * ; * TO THE CURRENTLY ACTIVE TASK'S NUMBER. * ; * IF THE "WAIT" STACK IS FULL, "QTIME" WILL EXIT WITH THE ERROR * ; * CODE WORD ON THE STACK NON-ZERO. THE MODULE WILL NOT BE QUEUED* ; * "QTIME" TAKES ITS ERROR EXIT IF THE REQUESTED MODULE IS ALREADY* ; * IN EITHER A TIMER THREAD OR THE "WAIT" STACK, AND HAS NOT BEEN * ; * FLAGGED FOR DE-QUEUEING. GOOD RETURNS ARE MADE WHEN THE MODULE* ; * IS FOUND INACTIVE ORMOVB DAYTAB(R3),R3 ;GET # DAYS/MONTH INTO A WORD MOV (SP)+,R5 ; GET RETURN ADDRESS OUT OF WAY ****2/21/7O CMP R3,(SP) ;CHECK IF PAST END OF MONTH BGE ADDN30 ;STILL THIS MONTH SUB R3,(SP) ;GET DAY OF NEXT MONTH ADDN30: ;NOW RESTORE MODULE START WORD & STACK SWAB (SP) ;POSITION "DATE"... ASL (SP) ASL (SP) ASL (SP)  DCBF TST DTERR ; ANY ERRORS? DCBF BNE STA270 ; YES. DCBF RTS PC ; DCBF ; DCBF ; TTYOUT TYPES THE SPECIFIED MESSAGE BUFFER ON THE TTY. DCBF TTYOUT =. ; ENTRY POINT DCBF MOV L LODL25 ;NO: LEAVE AS FILE I.D. MOV DFLIST+4,R0 ;YES: REPLACE WITH IFD FOR CORE DIRECT'Y BIS #100000,R0 ;FLAG AS AN IFD LODL25: MOV R0,IFD(R1) ;PUT ONE OR THE OTHER IN THE TABLE CLR HEADER(R1) ;SHOW TASK IS READY TO RUN ASR R1 ;RETURN TO BYTE INDEX CMP R1,TASKS ;TASKS = MAX[TASKS,TASKNO] BLE LODL26 MOV R1,TASKS LODL26: MOV #$TKFLS,-(SP) ;MUST WRITE  MARKED FOR DE-QUEUEING IN THE "WAIT" STACK* ; * IN THIS LAST CASE, THE MARK FOR DE-QUEUEING WILL BE REMOVED, * ; * AND THE MODULE WILL REMAIN WHERE IT IS ON THE "WAIT" STACK. * ; * * ; * PROGRAMMER: 52 * ; * VERSION:003.005 * ; * DATE: 13-APR-72 * ; *  ;...FOR PLACE BACK IN "START" WORD SWAB 2(SP) ;POSITION "HOUR" ASR 2(SP) ASR 2(SP) ;...FOR ITS PLACE BIS (SP)+,(SP) ;[OR] DATE & HOUR... BIS (SP)+,(SP) ;...WITH MINUTE... MOV (SP)+,STRTWD(R0);...AND RE-STORE INTO START WORD MOV R5,PC ; RETURN (ADDRESS IN R5, SEE ABOVE) ****2/21/7O .PAGE ; ******************************************************************** #KBLIST,-(SP) ; PUT I/O LIST ADDRESS ON THE STACK. DCBF EMT $TYOUT ; DO I/O . DCBF RTS PC ; DCBF .END ; DCBF OUT CURRENT VERSION OF JSR PC,PFRITE ;TASK TABLES, SINCE WE UPDATED THEM LODL28: ;COMMON EXIT POINT: BE SURE TO CLOSE ALL OPEN "BFUP" ELELMENTS ; (LIST IS ALREADY INITED TO CLOSE THE LOAD MODULE.) MOV MODCNT,R0 ;# OF OBJECT MODULE ELEMENTS TO CLOSE MOV #NAMBUF,R1 ;LIST OF MODULE NAMES LODL40: MOV #BFBLK1,-(SP) EMT BFCLOS ;CLOSE LOAD MODULE FIRST, THEN OBJ MODS CLR BFSTAT ;TYPE = OBJECT MOD * ; * G U L F E L E C T R O N I C S Y S T E M S * ; * * ; ******************************************************************** .TITLE TIMERS .DEF QTIME .DEF TIMER .DEF TWAITB,TTBPTR,TFIRST,TLAST,RESTAB,CURTAB,TIMBSY,BASCNT .REF UNSPND,QUEUE .REF $CTASK,$PRIOR,SUSPND .REF PUSH; * PROGRAM IDENTIFICATION: "QSKED" * ; * SYSTEM SUBROUTINE TO QUEUE A SCHEDULER MODULE * ; * * ; * PURPOSE: * ; * PUTS ADDRESS OF CALLER'S MODULE IN INTERNAL STACK. * ; * THIS TABLE IS EMPTIED BY THE ROUTINE "SKNSRT" WHICH IS * ; * CALLED BY THE SCHEDULER EACH MINUTE JUST BEFORE IT ND.E Y ORCTREDIL BOYM SERADLOF OND;E . = NDDELS E BLTAL BOYM SOR FCEPA SVEERES;R +.*2SZSD$L.= R FEUF BEDEDNEUNR VE OESITWR: Y"ORCTREDIL BOYM SERADLO;" : GNDBLS T UNCOR TEACARCHL UACT;A 0 D OR.W: NTPCIN NGRISTD ANMMCOR FOR FEUF BUTNP ITY;T *7BJXO$M D OR.W: ATCDAS ERFFBUN IORSVEON CRYRAPOEM;T 0 0,0, D OR.W: UFPBTM E.ULOD MER PDSOR WURFOS SE U. LEDUMOH AC EOR FONTI=ULE MOV (R1)+,BFNAME ;FILL LIST WITH NEXT OBJ MODULE NAME MOV (R1)+,BFNAME+2 CMP (R1)+,(R1)+ ;BUMP PAST SECTOR INFO IN LIST DEC R0 ;MORE? BGE LODL40 .PAGE MOV #ND2MSG,TTYBUF ;"PASS 2 END" MESSAGE MOV #TTYLST,-(SP) EMT TTYOUT EMT EXIT ;****** E N D O F L O A D E R****** BSZTAB: ;TABLE OF MAX ALLOWABLE BLOCK OR "PAGE" SIZES ;  ; PCHR CLR R4 ; CLEAR OUTPUT REGISTERS PCHR CLR R5 ; PCHR MOV R3,R5 ; PUT CHAIN WORD INTO R5. PCHR ASHC #9.,R4 ; AND SHIFT SECTOR NUMBER INTO R4 PCHR MOV R3,R5 ; THEN GET THE SECTOR RELATIVE PCHR BIC #SECMSK,R5 ; WORD NUMBER IN R5.  RUNS* ; * THIS METHOD AVOIDS QUEUEING AND SCHEDULER CONFLICTS WHE* ; * ACCESSING THE TWO SCHEDULER THREADS(THE SCHEDULER DROPS* ; * THE CPU LEVEL SO AS NOT TO LOCK OUT INTERRUPTS UNNECES-* ; * SARILY), REDUCING THE CONFLICT AREA TO JUST THE FIFO * ; * TABLE. THIS CONFLICT IS AVOIDED, THEN, BY RUNNING * ; * "QSKED" (A SHORT ROUTINE) AND THE FEW WORDS OF CODE * ; * IN "SKNSRT" WHICH ACCESS THE TABLE, UNDER MAORNF IORCTSED AN..;. . ..ESAM N50AD RLEDUMOJ OBS LDHOR FEUF;B . .+*8BJXO$M.=: UFMBNA ******************************************************************** ; OLMBSYD NEFIDEUNR FOD LSN IOTSLT EX;N 0 D OR.W E:YMUS T EX TINT LO SENOPT ENRRCUO TERNTOI;P 0 D OR.W: TRTPTX T EX TNTDESIREF OINEG BATC PNTREUR;C 0 D OR.W: RGTOTX T EX TNTREUR CINA AT DOFT UNCOE YT;B 0 D OR.W C:TBTX UTTPOUT EX TERFT AOWFLT ECIR DTOD SE UCHWI;S F FOR EACH PRIORITY. THE SIGN BIT IS SET IF THE PRIORITY IS ; DYNAMIC, I.E., NOT FIXED NOR TIME-SLICE. THEIR PARTITIONS ARE ; FIXED IN SIZE, AND THEY MUST REQUEST THE MAXIMUM SIZE WHENEVER ; THEY ARE LOADED INTO MEMORY. .WORD PRIP01&100000!$PS001 .WORD PRIP02&100000!$PS002 .WORD PRIP03&100000!$PS003 .WORD PRIP04&100000!$PS004 .WORD PRIP05&100000!$PS005 .WORD PRIP06&100000!$PS006 .WORD PRIP07&100000!$PS0R,POPR,RESTOR .PAGE QTIME: ;ROUTINE TO PUT TIMER MODULE IN "WAIT" STACK MOV PS,-(SP) ;SAVE USER'S PS MOV #340,PS ;RAISE CPU LEVEL TO PROTECT ROUTINE MOV R0,-(SP) ;SAVE USER'S CMP TTBPTR,#TMTBND ;SEE IF STACK IS FULL BHI QTIM50 ;YES: ERROR EXIT MOV 10(SP),R0 ;ADDRESS OF MODULE DEC (R0) ;IS TIMER MODULE INACTIVE? (T/W=0?) BNE QTIMINTERRUPT- * ; * LOCKOUT. * ; * * ; * USAGE: * ; * USERS CAN CALL "QSKED" EITHER VIA JSR (IF LINKED) OR * ; * VIA EMT. IN EITHER CASE THE ADDRESS OF THE MODULE TO BE* ; * THREADED MUST FIRST BE PLACED ON THE STACK.THE STACK * ; * POINTER IS LEFT UNCHANGED ON RETUR 0 : CHWITS R TOEC SERILRA TALTINI IOFE AV;S 0 D OR.W: SVSCTR CTRUSTINR LEAITRT RSFIF OPCR FOY OREM;M 0 D OR.WE:AVCSAPTR " PC "ERILRA;T 0 D OR.W C:APTR CKLO BERILRA TINE ACSPT EX;N 0D OR.W : ERNTOILPAITR L BOYM SEDINEF DOR FSD LING INENOPT EX;N 0 D OR.W : MESY LEDUMOA N INGDIEA RENWHR TEUNCOR TOEC;S 0 D OR.W: CTCTSE D LSN IMENAN IOCTSET ENRRCUO TERNTOI;P 0 D OR.W: CTSEPT C ENQUSEO ER-ZNE ONGTIECB07 .WORD PRIP08&100000!$PS008 .WORD PRIP09&100000!$PS009 .WORD PRIP10&100000!$PS010 .WORD PRIP11&100000!$PS011 .WORD PRIP12&100000!$PS012 .WORD PRIP13&100000!$PS013 .WORD PRIP14&100000!$PS014 .WORD PRIP15&100000!$PS015 .WORD PRIP16&100000!$PS016 .PAGE REGSAV: MOV R4,-(SP) ;R5 PUSHED BY "JSR" MOV R3,-(SP) ;SAVE REST... MOV R2,-(SP) MOV R1,-30 ;NO: SEE IF ACTIVE OR IN "WAIT" STATE QTIM20: ;HERE WHEN CLEARED TO STACK UP MODULE ADD #2,TTBPTR ;PUSH "WAIT" STACK POINTER MOV R0,@TTBPTR ;ENTER MODULE ADDRESS INTO "WAIT" STACK ; ******** ; MOV #TIMBIT!TODBIT!STLBIT,CLKENB ; START UP FAST CLOCK ******** ; ALWAYS ON FOR CITGO SYSTEM. ******** ; N. THE STACK LOCATION* ; * ITSELF WILL BE CLEARED IF THE TABLE HAS ROOM FOR * ; * IT AND THE MODULE ITSELF IS INACTIVE (ITS THREAD WORD * ; * MUST BE =1). IN CASE OF ONE OF THE ABOVE ERRORS, THE * ; * STACK LOCATION IS LEFT UNCHANGED (NON-ZERO) FOR TESTING* ; * BY THE CALLER. * ; * "QSKED" SAVES & RESTORES ALL REGISTERS THAT IT USES. * ; * IT MAY BE CALLED BY ANY TYET DOR FERNTOI;P 0 D OR.W: .0R1PT SD LINY TREND MOJ OBT ENRRCUO TERNTOI;P 0 D OR.W: BJROPT E IZ SAMGRRO PNTREUR;C 0 D OR.W: ZESIPR 0 1, E YT.B: ROEZON E ULOD MADLOF OINEG BOMFRT SEFF OPSEE;K 0 : ETFSOF T IS LUTNP IINS MENAO TERNTOI;P 0 : TRMPNA Y TTM RO FUTNP IESAM NOR FERNTOU;C 0 : TRMCNA / N./O 50AD.R N IOCTSES CEENEREF RORITON MOFE AM;N / M/. 50AD.R: ECNSMO NKLIO TESULOD MOF# F ONTOU;C 0 D OR.W>(SP) MOV R0,-(SP) JMP (R5) ;...AND RTN REGPOP: ;RESTORE RGS TST (SP)+ ;POP UNNEEDED R5 MOV (SP)+,R0 ;RESTORE OTHERS... MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 RTS R5 ;...AND RTN ; ******************************************************************** GETPCR: ;RETURNS WITH PC AS OFFSET FROM RELOCATABLE ZERO  ******** TST 2(R0) ;CHECK OPTION FLAG FOR "SUSPEND" BMI QTIM60 ;"SUSPEND" SELECTED QTIM40: ;THIS IS THE "SUCCESSFUL" EXIT CLR 10(SP) ;PREPARE ERROR RETURN CODE TO SHOW O.K. QTIM45: ;HERE WHEN EXITING TO "SUSPEND". AVOID CLEARING 10(SP) MOV 6(SP),4(R0) ;LOAD NEW TIMER/RESET WORD INTO MODULE ; THIS SERVES AS NORMAL PE OF USER AT ANY TIME. * ; * * ; * G U L F E L E C T R O N I C S Y S T E M S * ; ******************************************************************** .PAGE QSKED: ;SUBROUTINE TO QUEUE A SCHEDULER MODULE ;TO WAIT FOR INSERTION INTO ONE OF THE ;TWO SCHEDULER THREADS MOV (SP),-(SP) ;MOVE : NTDCMO XTTEW/D DEOA LSSREDD ASTHEIG HRSBEEMEM;R 0 D OR.W: PCGHHI " PC "VETILAREF OUEAL VNTREUR;C 0 D OR.W C:RPCU E ULOD MINK OCBLT RSFIR FOG LA;F 0 : K1OCBL CKLO BUTNP IINE ACPLT ENRRCUO TERNTOI;P 0 D OR.W: TRKPBL T UNCOE YT;B 0 D OR.W : BC " TSECAS "NGRINOIGR FOH TCWI;S 0 D OR.W: CHWIAS OLMBSYT ENRRCUR FOG LA FOCEL/RBS;A 0 D OR.W: ALSVAB ERFFBUN IERADHEK AS TOFD OR WSTIR;F S YTDB+LK1TBTX : MOV #-LDBYTS+2,R4 ;ACCOUNT FOR LEAD WORDS ALREADY IN CURPC BR GETPC1 GETPC: ;RETURN WITH OFFSET FROM LOAD MODULE BASE ZERO MOV #2,R4 ;SINCE PC INCREMENTS AFTER FETCH GETPC1: ADD CURPC,R4 ;PC @ TEXT BLOCK START ADD OFFSET,R4 ;OFFSET SPECIFIED WITH RLD COMMAND RTS PC ; ******************************************************************** SYMOVF: ;CHECK FOR SYMBOL TABLE OVERFLOW CMP INIT FOR TIMER MODULE, AND ALSO RESETS ; THE "RESET" BYTE IN CASE MODULE IS BEING RE-QUEUED AFTER BEING ; DE-QUEUED, ALL WHILE REMAINING IN "WAIT" STACK. QTIM50: ;HERE WHEN EXIT IS TO LEAVE NON-ZERO ERROR CODE ON STACK DEC (R0) ;SET T/W=-1 TO SHOW IN "WAIT" STATE... ;...OR TO RESTORE MODULE'S T/W IF IT IS FOUND ALREADY ACTIVE... ; ...OR ALREADY IN "WAIT" STATE MOV (SP)+,R0 ;RESTORE USER'S MOV (SP)+,2(SP) ;MOVE RETURN ADDRESS UP FOR RTI LATER MOV PS,2(SP) ;...AND SET UP PS FOR RTI, TOO MOV R0,-(SP) ;SAVE USER'S MOV #340,PS ;RAISE CPU LEVEL TO AVOID INTERFERENCE CMP STBPTR,#SKTBND ;IS TABLE FULL? BHIS QSKA40 ;YES: POINTER IS AT BOTTOM, SO ERROR XIT MOV 6(SP),R0 ;MODULE'S ADDRESS BIC #10000,2(R0) ;CLEAR "D" FLAG IN CASE WAS DE-QUEUED DEC (R0) ;IS MODULE INA= GNDBHE E AG.P F RED NEFIDEUNF OMENAN IRSHA CIX;S , ,,,, E YT.B: AMDNUN 0 D OR.W 6 D OR.W: EFDDUN ******************************************************************** ; N VE.E 6:D0EN LF E YT.B " ESNCREFERED VEOLESNR"U IISC.A F ,LLF E YT.B */********/* IISC.A 0 D OR.W . 4-6-D0EN D OR.W: EDDHUN E AG.P N VE.E 5:D0EN 0 0,0,0,0,0, E YT.B: ALBVGL ; ,'' 0,0,0,0,0,0, E YT.B: ALOBGL " " II6USYME,#LSDEND-BPSYM BHI LDER26 ;SYMBOL TABLE END REACHED RTS PC LDER26: MOV #26,R4 ;OVERFLOW: "TH-TH-THAT'S ALL, FOLKS!" JSR PC,ERRPRT .PAGE SRMODN: ;SEARCH DEFINED SECTION OF LSD FOR A MODULE NAME ; INPUT: R4 POINTS TO RAD50 NAME ; OUTPUT: R4 POINTS TO NAME IN LSD (IF FOUND) ; R4 UNCHANGED IF NOT FOUND ; CALL: JSR PC,SRMODN ; OLD [PS] IN PREP FOR RTI RTI ;ZAP! RETURN TO USER OR GO TO SUSPEND ;ON OLD CPU LEVEL QTIM30: ADD #2,(R0) ;NOT INACTIVE. SEE IF ACTIVE OR "WAIT" BNE QTIM50 ;ACTIVE: TAKE ERROR EXIT CMPB 5(R0),#-1 ;IN "WAIT": IS IT FLAGGED FOR DE-QUEUE? BNE QTIM50 ;NO: ERROR EXIT BR QTIM40 ;YES: LEAVE THERE AND REMOVE D-Q FLAG .PAGE QTIM60: CTIVE (THREAD WORD = 1)? BEQ QSKA20 ;O.K. ADD #2,(R0) ;SEE IF IN "WAIT" TABLE BEQ QSKA30 ;YES: O.K. TO TAKE GOOD EXIT NOW BR QSKA35 ;IN THREAD: TAKE ERROR EXIT QSKA20: ;MODULE READY FOR INSERTION IN TABLE ADD #2,STBPTR ;PUSH TABLE POINTER MOV R0,@STBPTR ;LOAD NEW MODULE INTO TABLE QSKA30: CLR 6(SP) ;NOW READY TO EXIT. CLEAR ERROR FLAG QSSC.A G LA FM" "LEIBSSPOT PUO TCELA;P 0 E YT.B G:LAMF " " IISC.A T ,H' E YT.B 0 D OR.W . 4-5-D0EN D OR.W Y:TREN E AG.P ******************************************************************** ; N VE.E 4:D0EN 0 0,0,0,0,0, E YT.B: IZMSCU HT0,0,0,0,0,0, E YT.B: IZCSSE HT0,0,0,0,0,0, E YT.B: ALCVSE HTT,,H'> E YT.B 0 0,0,0,0,0, E YT.B: AMCNSE '< E YT.B 0 D OR.W . 4-4-D0EN D OR.W : CTSE E AG.P 2 BR A ;FOUND ; BR B ;NOT FOUND MOV R0,-(SP) ;SAVE IT MOV #LSDBGN,R0 ;START OF LSD SRMOD1: CMP R0,SYME ;REACHED END OF DEFINES? BLO SRMOD2 ;NOT YET MOV (SP)+,R0 ;NOT FOUND! ADD #2,(SP) ;ALTER RETURN FOR "NOT FOUND" RTS PC SRMOD2: CMPB #OBJMN,FLAGS+1(R0);THIS ENGRY AN OBJ MOD NAME? BEQ SRMOD3 ;YES: IS NAME  ;HERE WHEN TASK IS TO BE SUSPENDED UNTIL TIMER EXPIRES MOVB $CTASK,2(R0) ;LOAD MODULE TASK # WITH CURRENT TASK MOV 4(SP),10(SP) ;SET CALLER RTN TO LOOK LIKE "JSR" MOV #SUSPND,4(SP) ;SET STACK SO RTI WILL GO TO "SUSPEND" MOVB #5,QTMCNT ;MUST SHIFT FIVE WORDS ON STACK QTIM70: MOV (SP)+,-4(SP) ;SHIFT THE FIVE WORDS ON STACK DOWN ONE ;WORD. CAN FOOL WITH POINTER SINCE UNDER LOCKOUT DECB QTMCNT KA35: DEC (R0) ;EITHER SETS T/W = -1 TO SHOW IN "WAIT" ;...OR RESTORES T/W TO ORIGINAL, IF NOT THREADED QSKA40: MOV (SP)+,R0 ;RESTORE USER'S RTI ;RESTORE USER'S PS & RETURN .PAGE DQSKED: ;SYSTEM SUBROUTINE TO DE-QUEUE A SCHEDULER MODULE MOV (SP),-(SP) ;RE-ORDER STACK FOR "RTI" RETURN AT END MOV PS,2(SP) ;STACK NOW READY FOR "RTI" JSR R5,PUSHR ;PUSH ALL N VE.E 3:D0EN " ALOT"T IISC.A HT E YT.B E"IZ"S IISC.A HT E YT.B T"SEFF"O IISC.A HT E YT.B " RYNT"E IISC.A T ,HHT E YT.B " ONTIEC"S IISC.A F ,L']0,0,0,0,0,0, E YT.B E:TLTI [": LEIT TNTMELE"E IISC.A LF E YT.B *"********"* IISC.A 0 D OR.W . 4-3-D0EN D OR.W: LEDUMO E AG.P N VE.E 1:D0EN F ,LLF0,0, E YT.B: TENUMI R ,C':0,0, E YT.B : URHO T ,HHT0,0, .SAME? SRMOD4: ADD #BPSYM,R0 ;NOT AN OJB MOD BR SRMOD1 SRMOD3: CMP (R4),(R0) ;FIRST HALF-NAME MATCH? BNE SRMOD4 ;NO CMP 2(R4),2(R0) ;YES: SECOND HALF-NAME MATCH? BNE SRMOD4 ;NO ; FOUND! MOV R0,R4 ;NOW POINTS TO LSD ENTRY MOV (SP)+,R0 RTS PC .PAGE PTGLOB: ;SEARCH LSD FOR A GLOBAL NAME (NOT OBJ MOD) ;THE SECRET TO THE LOADER'S CONTRO;DONE? BNE QTIM70 ;NOT YET CLR -(SP) ;"BOTTOM" OF STACK WILL BE RETURN ERROR ;CODE WHEN SUSPENDED TASK IS UNSUSPENDED SUB #12,SP ;RE-POSITION POINTER AT "TOP" OF STACK BR QTIM45 ;INSTEAD OF RETURNING TO CALLER .PAGE ; ******************************************************************** ; * REGS ONTO STACK MOV 20(SP),R0 ;MODULE'S ADDRESS MOV #340,PS ;LOCK OUT INTERFERENCE FROM SCHEDULER CMP #1,(R0) ;HAS MODULE BEEN DE-QUEUED ALREADY? BEQ DQSK20 ;YES: INACTIVE,SO IGNORE CMP #-1,(R0) ;IS IT STILL IN "WAIT" TABLE? BEQ DQSK50 ;YES: GO SET THE "D" FLAG MOV #2,R5 ;INIT COUNTER TO SEARCH BOTH THREADS MOV #TH1BGN,R1 ;START BY SEARE YT.B : ARYE R ,C'/0,0, E YT.B Y:DA R ,C'/0,0, E YT.B H:NTMO T ,HHT E YT.B *"** *"] IISC.A ************ **************;* EDOD-CRDHAY TLENRRCUE AM;N P"TMOD"L IISC.A 6 .-.= **********ICAMYN DISE AM NNTMELE EADLON HE WISTHE OVEM R**************;* ICAMYN DBEY LLUANTVE ELLWI- E AM NNTMELE EADLO ;0 0,0, D OR.W: AMDNLO ESYT BOF# N VE EBET US;M ["T ENEMELD OA L****" IISC.A " ****P MAD OA LODSLRO* ***L SECTION ABILITY LIES HERE. ; IF THE SECTION IS ONE OF THE NAMED ONES, IT APPEARS ONLY ONCE IN THE ; LSD, AND THUS HAS ONLY ONE BASE TO LOAD PROGRAMS FROM. THE UNNAMED ; C-SECTS, HOWEVER, ARE DETECTED AS 6 BLANKS, AND ARE MADE UNIQUE TO ; EACH OBJECT MODULE BY LIMITING THE SEARCH TO THE CURRENT OBJECT MODULE ; AREA IN THE LSD. ; INPUT: R4=PRT TO RAD50 NAME ; OUTPUT: R4=PTR TO LSD ENTRY IF FOUND ; CALL: JSR PC,PTGLOB ; BR A ;NOT FOU * ; * D Q T I M E * ; * PROGRAM IDENTIFICATION: "DQTIME" * ; * TIMER MODULE DE-QUEUEING SUBROUTINE * ; * * ; * PURPOSE: * ; * REMOVES TIMER MODULES FROM TIMER THREADS, IF ACTIVE * ; * AND IF FOUND IN ITS PROPER THREAD. IF ACTIVCHING THREAD #1 DQSK10: ;LOOP RETURN POINT FOR THREAD SEARCH MOV R1,R2 ;COPY ADDRESS OF UPSTREAM MODULE MOV (R1),R1 ;GET DOWNSTREAM MODULE'S ADDRESS BEQ DQSK40 ;END OF THREAD CMP R0,R1 ;IS THIS THE MODULE WE ARE LOOKING FOR? BNE DQSK10 ;NO MOV (R1),(R2) ;YES: "BRIDGE" OVER THIS MODULE IN THREAD MOV #1,(R1) ;...AND SET T/W = 1 TO SHOW INACTIVE "* IISC.A FF E YT.B 0 D OR.W . 4-1-D0EN D OR.W: NGDIHE ******************************************************************** ; N VE.E: NDNEER CR E YT.B 0 0,0, E YT.B: UMRNER " #ORRR"E IISC.A CR E YT.B 0 D OR.W E AGSSMER ROERN IRSHA C;# -4-.NDNEER: SGRMER E AG.P N VE.E: ND2END CR E YT.B D"EN2 #SSPAD LOOS"R IISC.A CR E YT.B 0 D OR.W -4-.ND2END: SG2MND ******&ND ; BR B ;FOUND MOV R0,-(SP) ;SAVE IT MOV (R4),R0 ;IS THIS THE SPECIAL... BIS 2(R4),R0 ;...CASE OF 6 BLANKS? BEQ PTGL01 ;YES: START AT CURRENT OBJ MOD MOV #LSDBGN,R0 ;NO: BEGIN @ BEGINNING OF SYMBOL TABLE BR PTGL02 PTGL01: MOV PTROBJ,R0 ;CURRENT OBJ MOD PTGL02: CMP R0,USYME ;END? BLO PTGL03 ;NOT YET E BUT NOT * ; * FOUND, ERROR EXIT IS TAKEN. IF STILL IN "WAIT" STACK * ; * IT IS MARKED FOR REMOVAL WHEN "TMNSRT" IS RUN. * ; * IF MODULE IS ALREADY INACTIVE, NO ACTION TAKEN, AND * ; * GOOD EXIT IS TAKEN. * ; * * ; * USAGE: CALLED BY ANY ROUTINE WISHING TO DE-ACTIVATE A TIMER * ; * MODULE. CALLING SEQUENCE: DQSK20: ;HERE UPON SUCCESSFUL DE-QUEUE CLR 20(SP) ;ERROR RETURN STATUS: O.K. DQSK30: ;HERE FOR GENERAL EXIT FROM ROUTINE JSR R5,POPR ;POP REGS FROM STACK RTI ;RETURN SET ABOVE: RESTORE ORIGINAL CPU STATUS & RETURN DQSK40: ;HERE WHEN END OF THREAD REACHED MOV #TH2BGN,R1 ;SET UP FOR POSSIBLE SEARCH OF THREAD #2 DEC R5 ;LOOP COUNTER BNE DQSK10 ;STILL MUST ************************************************************** ; N VE.E: NDS2PA CR E YT.B N"GIBE2 #SSPAD LOOS"R IISC.A CR E YT.B 0 D OR.W GESAES M2"S AS"PN IRSHA C;# -4-.NDS2PA: MGS2PA ******************************************************************** ; N VE.E: ND1END CR E YT.B D"EN1 #SSPAD LOOS"R IISC.A CR E YT.B 0 D OR.W E AGSSME" 1ND"EN IRSHA C;# -4-.ND1END: SG1MND ******************"MOV (SP)+,R0 ;NOT FOUND! RTS PC PTGL03: CMP (R4),(R0) ;FIRST HALF-NAME MATCH? BNE PTGL04 ;NO CMP 2(R4),2(R0) ;2ND HALF-NAME MATCH? BNE PTGL04 ;NO ;MATCH! CMPB #OBJMN,FLAGS+1(R0) ;FILTER OUT OBJ MOD NAMES BEQ PTGL04 MOV R0,R4 ;NOW POINTS TO FOUND NAME IN LSD MOV 4(R4),R0 ;SYMBOL'S FLAGS BIC #-ABSREL-1,R0 ;ISOLATE ABS/REL * ; * * ; * MOV #MODULE,-(SP) ;STACK MODULE'S ADDRESS * ; * EMT DQTIME ;REQUEST TO DE-QUEUE MODULE * ; * OR * ; * JSR PC,DQTIME ;DIRECT CALL WITH PROPER LINK * ; * TST (SP)+ ;POP ERROR RETURN CODE * ; * DO THREAD #2 BR DQSK30 ;SEARCH FAIL: EXIT WITH NON-ZERO ERROR DQSK50: ;HERE WHEN MODULE STILL IN WAIT" TABLE. MUST SET THE ; "D" DE-QUEUE FLAG IN MODULE TO FORCE IGNORE WHEN ; "SKNSRT" RUNS. IF MODULE IS QUEUED AGAIN BEFORE ; "SKNSRT" RUNS, THIS "D" FLAG WILL BE CLEREAD, AND MODULE ; WILL BE LEFT IN THE "WAIT" TABLE. BIS #10000,2(R0) ;SET "D" FLAG IN MODULE OPTION BYTE BR DQSK20************************************************** ; N VE.E D:ENID # ,'CR E YT.B " IA ID LOOS"R IISC.A CR E YT.B 0 D OR.W GESAES MD.I.N IRSHA C;# 4 .-D-ENID G:MSID E AG.P L UL FENWHT PUUT OA:RE ALDUI BERILRA;T 8.12.+.= : CKLOLBAITR E IM T AATR TOEC SNE OTERI;W . 64 D OR.W ERMBNUR TOEC SERILRA;T 0 D OR.W: ECASTR 0 0,0, D OR.W A RE AERILRA TOMFRE ITWRS AYLW;A 1 OC FLAG MOV R0,ABSVAL ;=0: ABSOLUTE; ELSE RELOCATABLE MOV (SP)+,R0 ;UNSAVE ADD #2,(SP) ;"GOOD" RETURN RTS PC .PAGE ;NO MATCH PTGL04: ADD #BPSYM,R0 ;NEXT LSD ENTRY BR PTGL02 ;TRY AGAIN .PAGE GETSEC: ;GET POINTER TO SECTION NAME ; INPUT: R4 POINTS TO RAD50 NAME ; OUTPUT: R4 POINTS TO NAMED SECTION IN LSD (IF FOUND) ; CALL: JSR PC,GETSEC ;  * ; * NOTE THAT THE THREE ROUTINES: [TIMER], [QTIME], AND * ; * [DQTIME] ALLOW AN UNLIMITED NUMBER OF CALLS TO QUEUE * ; * OR DE-QUEUE THE SAME MODULE, REGARDLESS OF ITS STATUS * ; * AT ANY GIVEN TIME. THE STATE UPON THE RETURN FROM A * ; * CALL TO [QTIME] OR [DQTIME], ASSUMING A ZERO ERROR CODE* ; * ASSURES THAT THE MODULE IS IN THE MOST RECENTLY * ; * REQUESTED STATE. TH ;TAKE GOOD EXIT COUNTR: .WORD 0 ;THIS IS THE ABORT/TIME-SLICE COUNTER!! ABMPLR: .WORD 0 ;MULTIPLIER FOR ABORT AND TIME/SLICE CURTHD: .WORD THDTAB ;POINTER TO CURRENT THREAD BEGIN WORD THDTAB: .WORD TH1BGN ;THREAD BEGIN TABLE .WORD TH2BGN .WORD TH1BGN TH1BGN: .WORD 0 ;ACTUAL BEGIN OF THREAD #1 TH2BGN: .WORD 0 ;#2 STBPTR: .WORD SWAITB ;SCHEDULER "WAIT" TABLE POINE YT.B: .WARTR 0 E YT.B E IL FCHAT BOR FD.I.E IL;F IDCHBT D OR.W ESITWRR LEAITRR FOR DEEA;H : EDAHTR ******************************************************************** ; A AT DCTJEOBR FOK OCBLD ONEC;S 8.12.+.=: K2JBOB TADAT ECBJ OOR FCKLO BSTIR;F 8.12.+.=: K1JBOB S ORCTSEO TWN IADRES AYLW;A 8.12 D OR.W R BEUM NORCTSEE IVATEL;R 0 D OR.W: ECJSOB 0 0,0, D OR.W AGFLE ITWRD/EA;R  BR A ;NOT FOUND ; BR B ;FOUND JSR PC,PTGLOB ;CAN NAME BE FOUND IN LSD? GETS01: RTS PC ;NO: ERROR RETURN CMPB #SECTN,FLAGS+1(R4) ;YES: IS IT A SECTION NAME? BNE GETS01 ;NO:ERR EXIT ADD #2,(SP) ;"GOOD" RETURN RTS PC ; ******************************************************************** SRGLOB: ;SEARCH LSD FOR A GLOBAL & RETURN ITS FINAL E ONLY EXCEPTION IS WHEN A CALL TO * ; * [DQTIME] HAS BEEN MADE AFTER THE REQUESTED MODULE HAS * ; * TIMED OUT AND BEGUN EXECUTION. STRICTLY SPEAKING, THE * ; * CALL IN THIS CASE CAME AFTER THE MODULE WAS RUN. * ; * * ; * G U L F E L E C T R O N I C S Y S T E M S * ; * * ; ************************TER SWAITB: .WORD 0 ;TOP OF "WAIT" STACK IS ALWAYS ZERO .=$SWATZ*2+. ;THE SCHEDULER "WAIT" TABLE SKTBND = .-2 ;END OF "WAIT" TABLE DAYTAB = .-1 ;THIS IS THE 12-BYTE TABLE OF DAYS-PER-MONTH JANARY = . FEBARY = .+1 .BYTE 31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31. .EVEN CLOCK: ;EXTERNAL REFERENCE FOR TIME-OF-DAY CLOCK AND CALENDAR TICTOC: .BYTE 0 ;COUNTS CLOCK BEATS PER SE 0 E YT.B ORCTSEE IVATEL;R 0 E YT.B E IL FCHAT BOR FD.I.E IL;F IDCHBT D OR.W ESULOD MCTJEOBG INADRER FOR DEEA;H : EDJHOB ******************************************************************** ; K OCBLE AV SXTTED ONEC;S 8.12.+.=: K2TBTX CKLO BVESAT EX TSTIR;F 8.12.+.=: K1TBTX METIH AC EERSFANTRO TDSOR W;# 0 D OR.W: NTTCTX XTTEE OTRI/WADREO TORCTSEE IVATEL;R 0 D OR.WVALUE IN R4 ; INPUT: R4=ADDR OF GLOBAL NAME (RAD50) ; OUTPUT: R4=VALUE OF GLOBAL JSR PC,PTGLOB ;SEARCH FOR NAME BR LDER22 ;NAME NOT FOUND IN LSD MOV VALF(R4),R4 ;FOUND: GET VALUE RTS PC ; ******************************************************************** INUSYM: ;INSERT AN ENTRY IN UNDEFINED SECTION OF LSD ; INPUT: R4 POINTING TO ".REF" ENTRY IN GSD MOV R0,-(SP) ;SAVE IT******************************************** .DEF DQTIME .PAGE DQTIME: ;SYSTEM SUBROUTINE TO DE-QUEUE A TIMER MODULE MOV (SP),-(SP) ;MOVE RTN ADDR IN PREP FOR "RTI" AT END MOV PS,2(SP) ;PLACE [PS] ALSO FOR "RTI" MOV #340,PS ;RAISE CPU LEVEL: PROTECT AGAINST "TIMER" JSR R5, PUSHR ;SAVE ALL REGISTERS MOV 20(SP),R0 ;GET MODULE'S ADDRESS CMP #1,(R0) ;IS MODUCOND SECOND: .BYTE 0 ;CURRENT TIME MINUTE: .BYTE 0 ;CURRENT TIME HOUR: .BYTE 0 ;CURRENT TIME JDATE: .WORD 0 ; CURRENT JULIAN DATE SET TO 0 UNTIL ******** ; OPERATOR INITIALIZES IT. ******** MONTH: .BYTE 1 ;CURRENT MONTH MDAY: .BYTE 1 ;CURRENT DAY OF MONTH YEAR: .BYTE 71. ;CURRENT YEAR (MINUS 1900) SKDBSY: .BYTE -1 : ECTSTX 0 0,0, D OR.W E YT BTERI/WADRET EX;T 0 E YT.B: .WTRTX ORCTSEE IVATEL;R 0 E YT.B E IL FCHAT BOR FD.I.E IL;F IDCHBT D OR.W NSIOATEROPE ITWRD/EA RERFFBUE AV SXTTER FOR DEEA;H : EDTHTX E AG.P ******************************************************************** ; LEFIN IRSTOEC S;# 0 D OR.W PETYE IL;F 0 D OR.W D.I.E IL;F 0 D OR.W RYTOECIR D MOV USYME,R0 MOV (R4)+,(R0)+ ;MOVE IN THE UNDEFINED MOV (R4)+,(R0)+ ;SYMBOL ENTRY MOV (R4)+,(R0)+ MOV (R4)+,(R0)+ ADD #BPSYM,USYME ;BUMP POINTER JSR PC,SYMOVF ;OVERFLOW? MOV (SP)+,R0 ;O.K. RTS PC .PAGE INSYME: ;INSERT AN ENTRY IN DEFINED SECTION OF LSD ; R4 POINTS TO THE ENTRY (E.G., IN GSD) ; ADJUST POINTERS SYME & USYME LE ALREADY INACTIVE? BEQ DQTM20 ;YES: TAKE GOOD EXIT MOVB #-1,5(R0) ;FLAG D-Q WITH "RESET" BYTE ALL ONES CMP #-1,(R0) ;IS MODULE STILL IN "WAIT" STACK? BEQ DQTM20 ;YES: NO NEED TO REMOVE FROM THREAD MOVB 3(R0),R1 ;IS IN ACTIVE QUEUE: TAKE IT OUT BIC #177760,R1 ;GET MODULE'S RESOLUTION ASL R1 ;USED AS WORD INDEX BELOW MOV R1,R3 ;SAVE RESO;SCHEDULER BUSY FLAG: IDLE=-1; .END RECOF IEDRNTURE: FD;I 0 D OR.W K TSRR,EORRR;E 0 0, E YT.B T IS LE"IL FNEFIDE;" 1 D OR.W: STLIDF * ****************************************************************** ; S)ORCTSEF O(#H GTEN LNTMELE;E 0 D OR.W: ZESIBF ) VETILAREE IL(FR TOEC SRTTA SNTMELE;E 0 D OR.W: CTSEBF E YP TNTMELE;E 0 E YT.B: PETYBF S TUTA SNTMELE;E 0 E YT.B: ATSTBF 0 0, D OR.W: MENABF # E IL;F  JSR R5,REGSAV MOV R4,R2 MOV SYME,R4 INSY01: JSR PC,UNSQUISH ;MAKE A HOLE AT SYME MOV (R2)+,(R4)+ ;MOVE IN THE ENTRY MOV (R2)+,(R4)+ MOV (R2)+,(R4)+ MOV (R2)+,(R4)+ JSR PC,SYMOVF ;OVERFLOW? JSR R5,REGPOP ;RESTORE RTS PC ; ******************************************************************** LDER22: MOV #22,R4 ;GLOBAL SYMBOL SEARCH LUTION IN CASE NEEDED BELOW CMPB R1,CURRES ;DID WE INTERRUPT "TIMER"... ;...WHILE IT IS ON THIS RESOLUTION? BNE DQTM05 ;NO: O.K. TO DE-QUEUE INC DQFLAG ;YES: FLAG "TIMER" TO RE-SCAN THREAD... BR DQTM20 ;...AND DO NOT REMOVE FROM THREAD NOW. DQTM05: ADD #TFIRST,R1 ;ADDR OF RESOLUTION'S "FIRST" WORD DQTM10: ;LOOP RETURN POINT FOR THREAD SEARCH MOV ND.E R"METI "INE IVCT ALEHI WONTILUSORET ENRRCUN ;O D UEUE-QDEE BTOD TEESQURES LEDUMOF O;# 0 D OR.W: AGFLDQ N VE.E E IVCT AR"METI "ENWHN IOUTOLES RNTREUR;C 0 E YT.B: ESRRCU ERNTOU CSEUL PONTILUSOREB-SUL NAIOPT;O 0 E YT.B: NTSCBA ] ERIM[TR FOR TEUNCOG INSTNE& G 0 D OR.W D OR WORRR;E 0 D OR.W: K1BLBF T IS LP"FU"B ; * ****************************************************************** ; ERFFBUA AT;D EDAHTR D OR.W EDRVSERED,OR WORRR;E 0 0, D OR.W: RRAETR ELEV;LORRR;E 3 0, E YT.B 0 D OR.W D ENSPSUC,IS;D 2 1, E YT.B R LEAITRR FOT IS;L 1 D OR.W: STALTR E AG.P A RE AXTTEO /TOMFRW R/S AYLW;A EDTHTX D OR.W FIALURE JSR PC,ERRPRT .PAGE INPTRH: ;INSERT AN ENTRY ALPHABETICALLY INTO CURRENT SECTION ;OF LSD. R4 POINTS TO CANDIDATE ENTRY. JSR R5,REGSAV MOV R4,R2 ;NEED R4 BELOW MOV PTSECT,R4 ;PTR TO BEGIN OF CURRENT SECTION INPT01: ADD #BPSYM,R4 ;NEXT (POSSIBLE) SECTION ENTRY ;[SKIP FIRST ONE: IT IS SECTION'S NAME]. CMP R4,SYME ;DID WE REACH  R1,R2 ;SAVE UPSTREAM MODULE'S ADDR MOV (R1),R1 ;ADDR OF DOWNSTREAM MODULE BEQ DQTM30 ;END OF THREAD: SEARCH FAIL ERROR CMP R0,R1 ;IS THIS THE MODULE TO BE DE-QUEUED? BNE DQTM10 ;NO: KEEP LOOKING MOV (R1),(R2) ;FOUND IT! BRIDGE OVER THIS MODULE... BNE DQTM15 ;...AND EXIT IF NOT LAST MODULE MOV R2,TLAST(R3) ;...BUT UPDATE "LAST" ENTRY IF WAS @ END LA;F 0 E YT.B: SYMBTI " METI"QN ISE UOR FERNTOU;C 0 E YT.B: NTMCQT E IZ SLEAB TALTUACO TET;S ESNR+$ABRTCU.= 15ES,R14ES,R13ES,R12ES,R11ES,R10ES,RS9RE E YT.B S8RE7,ES,RS6RE5,ES,RS4RE3,ES,RS2RE1,ES,RS0RE E YT.B : ABRTCU E YT BND;E 0 E YT.B E IZ SLEAB TALTUACO TET;S ESNR+$ABSTRE.= 15ES,R14ES,R13ES,R12ES,R11ES,R10ES,RS9RE E YT.B S8RE7,ES,RS6RE5,ES,RS4RE3,ES,RS2RE1,ES,RS0RE E YT.B  EDRVSERED,OR WORRR;E 0 0, D OR.W: RRTETX ELEV,LORRR;E 3 0, E YT.B 0 D OR.W NDPEUS SC;IS;D 2 1, E YT.B A RE AXTTEM RO/FTOS ERSFANTRR FOT IS;L 1 D OR.W: STTLTX * ****************************************************************** ; N RUG INUR DENOSCH: ERFFBUA AT;D 0 D OR.W: UFPBMA D VEERES;R 0 0, D OR.W ELEV,LORRR;E 0 0, E YT.B E ETPLOM C/O;I 0 D END OF DEFINED SYMBOLS? BHIS INPT02 ;YES: STICK IT IN NOW. CMPB FLAGS+1(R4),#GENTRY ;IS NEXT A GLOBAL SYMBOL ENTRY? BNE INPT02 ;NO: SECTION HAS ENDED: INSERT HERE. ; IT IS STILL IN THIS SECTION: COMPARE WILL DETERMINE ALPHABETIC ORDER CMP (R4),(R2) ;FIRST HALF-WORDS: BHI INPT02 ;NEW ONE IS LATER ALPHATETICALLY: BLO INPT01 ;NEW ONE IS EARLIER: KEEP LOOKING CMP 2(R4),DQTM15: MOV #1,(R1) ;FINALLY, FLAG MODULE INACTIVE DQTM20: CLR 20(SP) ;CLEAR RETURN ERROR FLAG FOR GOOD EXIT DQTM30: JSR R5,POPR ;RESTORE SAVED REGISTERS... RTI ;...AND RETURN TO CALLER WITH HIS PS .PAGE ; ******************************************************************** ; * T I M E R * ; * PROGRAM IDENTIFICATION: "TIMER" * NTNEMAER PE:BLTAR TEUNCON IOUTOLES;R : ABSTRE E AG.P DSOR WS]RE$N [ =ZESIE BLTAL UACT;A T ASTL2+S*RE$N.= S RDWO6 1E:IZ SLEAB TAX;M, ,,,,,,,,,,,,,, D OR.W Y.PTEMS ;I D EAHR TENWH] R)T(RSFI[TF OSSREDD;A HE TINTAON CD.EAHR T'SONTILUSOREH AC;E INE ULOD MSTLAO TRSTEINPOF OLEAB;T T:ASTL DSOR WS]RE$N [ =ZESIE BLTAL OR.W D ENSPSUR,TEINPRE IN;L 2 3, E YT.B AP MADLOR FOT IS;L 1 D OR.W: STPLMA * ****************************************************************** ; ERFFBUA AT;D EDJHOB D OR.W D VEERES RD,OR WORRR;E 0 0, D OR.W: RRJEOB TYRIIOPRT ESQUREC IS DK,AS TRR;E 3 0, E YT.B 0 D OR.W NDPEUS SC:IS;D 2 1, E YT.B STLID EA RLEDUMOT ECBJ;O 1 D OR.W: STJLOB ****************2(R2) ;1ST HALVES EQUAL: COMPARE 2ND HALVES BLOS INPT01 ;STILL LOWER: TRY AGAIN INPT02: ;TIME TO INSERT ENTRY INTO LSD CMP R4,PTROBJ ;IF INSERTING BELOW OBJ MOD POINTER... BHI INPT03 ADD #BPSYM,PTROBJ ;...MUST ADVANCE IT ALONG WITH OTHERS INPT03: BR INSY01 ;GO INSERT AT R4 .PAGE UNSQUISH: ;MAKE A HOLE IN TABLE. R4 POINTS TO DESIRED HOLE LOC'N MOV R0,-(SP) MOV R1,-(S; * HIGH-RESOLUTION CLOCK PULSE SERVICE ROUTINE * ; * * ; * PURPOSE: --SERVICES ALL TIMER MODULES AT THEIR RESPECTIVE * ; * RESOLUTIONS, PROVIDING THE FEATURES OF TASK * ; * TIME-DELAY, PERIODIC OR ONE-SHOT QUEUEING, * ; * FLAG-SETTING,AND COMPLETION-ROUTINE CALLS. * ; * --KEEPS TRACK OF THE TASK-EXECUTION TIME (ABORT)UACT;A STIRTF2+S*RE$N.= S RDWO6 1E:IZ SLEAB TAX;M, ,,,,,,,,,,,,,, D OR.W Y.PTEMS IADRETHN HE;W O ER ZINTAON CD.EAHR T'SONTILUSOREH AC;E N ILEDUMOT RSFIO TRSTEINPOF OLEAB;T : STIRTF N IOATOC LBEAL TSTLAF OSSREDD;A 2 .- = NDTBTM LEAB TOR FCEPA SVEERES;R +.*2TZWA$T.= 0YSWAALS ILEAB TT"AI"WF O'NOC LSTIR;F 0 D OR.W: TBAITW CKTA ST"**************************************************** ; ERFFBUA AT;D 0 D OR.W: UFYBTT D VEERES;R 0 0, D OR.W ELEV,LORRR;E 0 0, E YT.B E ETPLOM C/O;I 0 D OR.W D ENSPSU: PETYL AL C1; #TY TE:ICEV;D 2 0, E YT.B STLIO I/E YPETEL;T 1 D OR.W: STYLTT CEENQUSE" SELO"CA VIT XI;E 28DLLO P JM: 10RPER D TEESQUREN URET;R PC S RT N URET RSTUEEQ ROT NID D #ORRR;E P) MOV USYME,R0 ;START @ TOP ENTRY... MOV R0,R1 ADD #BPSYM,R1 ;...AND EXPAND UPWARD UNSQ01: CMP R0,R4 ;ARE WE DOWN TO DESIRED LOC'N YET? BHI UNSQ02 ;NOT YET: MOVE ANOTHER ONE MOV (SP)+,R1 MOV (SP)+,R0 ADD #BPSYM,SYME ;BUMP BOTH POINTERS ADD #BPSYM,USYME RTS PC UNSQ02: MOV -(R0),-(R1) ;BLOCK MOVE MOV -(R0),-(R1) MOV -(R0),-(  * ; * COUNTER, AND CALLS FOR TASK ABORT IF TIME * ; * RUNS OUT. * ; * --PROVIDES (OPTIONAL) TIME-SLICE FEATURE BY * ; * PERIODICALLY ROTATING THE TASKS IN A QUEUE. * ; * * ; * USAGE: ACTIVATED BY CLOCK INTERRUPT. ALL PROGRAMS HANDLE * ; * COMMUNICATION VIA "QTIME" AND "DQTIME". "AI"WO TERNTOI PLEAB TERIM;T TBAITW D OR.W: TRBPTT E AG.P M RAOGPRD TEUPRRTEINO TRNTUREL MAOR;N ORSTRE P JM : X3METI 15MATI P JM ZENIROCHYN-SREO TPTEMTT AANN ;I LYTEIAEDMM IEDUTECEXE- RISE INUTROE AS;C S HI TIN. ONTICUXE ENGRIDUD REURCC;O VEHAE INUTROR TEENO TNSIOASCC;O ALONTIDIADF IVEBO AESGO. ONTICUXE;E 10RPER L BP R4H IT WESOD CET SND ARETOES;R P POEG,RR5 R JS GESAES MSTUEEQ;R UTYOTT T EM ) SP-(T,LSTY#T V MO GESAES MORRR ENGTIINPRR FOT NI;I UFYBTTG,MSRR#E V MO ONSIERNVCOO TNTOI PRYNT ERYDAONEC SSE;U A NT2O,BPC R JS R ERMBNUE AGSSMER HA-C 3;A 2 ,R#3 V MO ERFFBUI CIASN IARCHT AS;L R33,M+NURR#E V MO RNTUREE WSECAN ;I V SAEG,RR5 R JS .ITEXL IL WSEEL; R1) MOV -(R0),-(R1) MOV -(R0),-(R1) BR UNSQ01 ; ******************************************************************** SQUISH: ;REMOVE ENTRY POINTED TO BY R4 FROM THE UNDEF'D TABLE JSR R5,REGSAV MOV R4,R0 MOV #BPSYM,R1 ;ELEMENT SIZE ADD R1,R0 ;STAYS ONE ELEMENT ABOVE R1 ASR R1 ;USE BELOW AS COUNTER SQUI01: CMP R0,USYME ;REACHED TOP OF TABLTIMER" * ; * CALLS SYSTEM SUBROUTINES "QUEUE", "SAVE", "UNSPND", * ; * AND "ABORT". * ; * * ; * G U L F E L E C T R O N I C S Y S T E M S * ; * * ; ******************************************************************** ; FOLLOWING ARE OFFSET PARAMETERS FOR E INUTROG INUR DNE OATS DESIREY LLMAOR;N X3METI E BL R TEUNCO" SYBU "NGTIES;N SYMBTI CBDE : X2METI ******** ; ******** . ONT IAS HYSWAALH ICWHO TGCI; ********R*FOT NOT BU- K OCCLT AS FHE TFF ORNTU; ******** E IVCT AESULOD MSTFAO N ; B ENLK,CITLBSTT!BIOD#T V MO ; ******** ERLLCAO TRNTUREL IL WT,SES ISB MIF ; ERMBNUR ROERY ARIN BTHWID TENI IDYEALR AR4 ; ******** NETIOU RNGTIINPRE AGSSMER ROER; . = RTRPER ******************************************************************** ; RNTURE: EDLLFIR FEUF BIISC;A PC S RT REMOR FOK AC;B TAONB2 T BG ? GOO TTSGIDII CIASE OR;M R2 C DE R4 R AS R4 R AS N IOATAGOPPRN IG SNTVERE;P R40,0000#1E? BHIS SQUI04 ;YES: EXIT SQUI02: MOV R1,R2 ;COUNTER=# WORDS PER SYMBOL SQUI03: MOV (R0)+,(R4)+ ;BLOCK TRANSFER DEC R2 BGT SQUI03 ;STILL IN BLOCK BR SQUI01 SQUI04: JSR R5,REGPOP SUB #BPSYM,USYME ;ADJUST POINTER TO BEGIN OF UNDEFINEDS RTS PC .PAGE NXTMOD: ;ROUTINE SETS UP PARAMETERS TO READ NEXT OBJ MODULE DEC NAMCTR ;MORE MODULES? TIMER MODULE REFERENCES SAVE = $SAVE ;OP-CODE FOR TRAP TO "SAVE" ROUTINE TASKNO = 2 ;TASK NUMBER BYTE OPTION = 3 ;OPTION FLAGS BYTE TIMBYT = 4 ;MODULE TIMER BYTE RESET = 5 ;TIMER RESET BYTE TIMARG = 6 ;ARGUMENT (FOR QUEUEING) ADDRESS WORD TMFLAG = 6 ;FLAG ADDRESS WORD (DYNAMIC OFFSET) TIMASK = 8. ;FLAG MASK WORD (DYNAMIC OFFSET) ; ONK OCCLE AVLE: TYMP EOT;N X2METI E BN STLI" ITWA "TYMP EOR FCKHE;C R PTTB@T T TS X1METI E BN T IS LLEHO WDOO TRESUE ;B R1 C DE CKLO CFF ORNTUT N'DO..;. X2METI E BN ..O.ER-ZON NISY ANF ;I + 0)(R T TS: X1METI CEENQUSET XI ENGRIDUE LSPUT OUK OC;L S ,P40#3 V MO ZESIT IS;L 1 ,RESNR#$ V MO DSOR WT"RSFI " C BI ITIG DALCT OXTNER FOG INFTHI SINEG;B R4 R AS E OD CIISC ATOE NGHA;C ) R3,(60#0 SBBI TSBIE RETHT ANICIFGNSIT ASLEY NL OVEEA;L ) R3,(70#3 CBBI ITIG DALCT OXTNER FON URET ROPLOO LS;A 3)(R,-R4 VBMO H GTEN LONTIRATE INGTIET-SRE PENWHE ER HERNT;E : TAONB2 ) RSHA C 6ALRMNO (THNGLEN IOATERITT NI;I 2 ,R#6 V MO: OCN2BI R BEUM NRYNABI= 4 R ; 1 S+ESDRADD ENN IOATINSTDE= 3 R BLT NXTM30 ;NO MORE: TAKE "DONE" EXIT CLR BLOCK1 ;FLAGS FIRST BLOCK IN MODULE MOV NAMPTR,R0 MOV 4(R0),OBJSEC ;START SECTOR # MOV 6(R0),SECTCT ;SECTOR COUNT INC SECTCT ;WANT ONE EXTRA SECTOR ON LAST READ ADD #8.,NAMPTR ;ADVANCE TO NEXT NAME MOV #OBJBK2,BLKPTR ;INIT BLOCK POINTER TO FORCE FIRST READ ADD #2,(SP) ;BUMP TO TAKE "GOOD" EXIT NXTM JSTARG = 6 ;USER ROUTINE ADDRESS WORD (DYN OFFSET) .PAGE TIMA00: RTI ;RETURN USED IF CLOCK IS RE-ENTERED ;TO PROCESS QUEUE WHILE PREVIOUS REQUEST IN PROGRESS. TIMA70: ;HERE TO RESET RESOLUTION COUNTERS ;WHEN THEY EXPIRE (FROM TIMA20) MOVB RESTAB(R0),CURTAB(R0) ;RESET FROM PERM TABLE INC R0 ;BUMP TO NEXT RESOLUTION... TSTB OFT IS LANSCO TREPARE;P R0T,RSFI#T V MO ] ERIM[TR FOT INPOT XI;E : XTMETI E AG.P Y RLEAT XI EE:ON;D 35MATI BR NGKIOO LEPKE: ES;Y 92MBTI T BG D?IN FTOE OR MNY;A AGFLDQ C DE E IVCTNA IRDWOD-EAHR TET;S ) R1,(#1 V MO: 94MBTI ERNTOI PT"AS"LE ATPD UE:ULOD MND EAS;W 0)(RSTLA,TR2 V MO ADRETHN IALIN FOT;N 94MBTI E BN LEDUMOD UEUE-QDER VE OGEIDBR! NE OND ; ) A"NT2O"B @ERNT EIF (THNGLEN IOATERIT= 2 R T:PUIN ; " ONSIERNVCOI CIASL TAOCO TRYNABI "NETIOUBRSU ; ******************************************************************** ; PC S RT R TEINPRE IN;L TRRNLP T EM ) SP-(T,LSAP#M V MO R TEINPRE IN LTOT EME AK MTOE INUTRON MOOM;C : LLCALP E AG.P PC S RT C PEDAV SOP;P + P)(S T TS RDWOT EX TENOPT EX NTOR TEINPO30: RTS PC .PAGE ;"NEXT BLOCK": SUBROUTINE READS IN SECTORS UNTIL ; AT LEAST ONE BYTE OF NEXT BLOCK IS IN UPPER HALF OF THE ; TWO-SECTOR BUFFER. ONE ADDITIONAL SECTOR IS READ AFTER ; THE FINAL SECTOR IN THE MODULE TO FORCE THE LAST BLOCK ; INTO THE UPPER HALF. NXTB90: JSR PC,NXTMOD ;INIT FOR NEXT MODULE AND READ A BLOCK BR NXTB80 ;NO MORE MODULES NXTBLK: MOV RESTAB(R0) ;...AND SEE IF THIS IS THE END BNE TIMA20 ;NOT YET: MORE BR TIMA30 ;END OF COUNTERS: DO ALL THREADS TIMER: ;ENTRY FROM INTERRUPT: CPU LEVEL 7 .IFNZ $TMBAS ;OPTION ALLOWS RESOLUTION FINER THAN RES1 DECB BASCNT ;COUNT DOWN BASIC MULTIPLIER BEQ TIMA10 ;TURNED OVER: ENTER TIMER PROGRAM RTI ;NO NEED TO ENTER TIMA10: OU;F ) R2,(1)(R V MO G INOKLOP EE KO:;N 92MBTI E BN +0EDGGLA FLEDUMOS HI TAS;W 77#3),R15( PBCM T XI EOW NAN CD:ENS D'EAHR;T 35MATI Q BE SSREDD A'SLEDUMOT EX;N 1 ,R1)(R V MO: 92MBTI D OR WAMRESTUPR BEEMEM;R 2 ,RR1 V MO D OR WRTTA SADRETHR PERO;P 1 ,RR0 D AD D EAHR TELAVTRE- RTOY ARSSCENES ;I R1T,RSFI#T V MO N S'RET EX NET GY.ARSSCENEK ECCHO NO:;N 35MATIL UACT;A R PTXT,TR3 V MO R31,BKXT#T D AD A RE AXTTEF OOP TOMFRT SEFF OET;G 3 ,RR4 B SU CKLO BXTTET EX NOFN GIBER FOC ;P 3 ,RP)(S V MO E NGHA CPCA F OSECAN I",TRTPTX "TELACUAL-CRES AYLW;A : 40TOTX C PINEG BEW;N G ORXT,TR4 V MO R4 L AS R4 L AS R4 L AS R4 L AS R4 L AS R4 L AS XTTEW NEF OINEG BATC PET GOW;N R4 L AS #ONEZRO,PTR1.0 ;INIT PTR TO [1] CMP BLKPTR,#OBJBK2 ;ARE WE INTO LOWER SECTOR? BLO NXTB30 ;NO-NEW READ NOT NEEDED NXTB10: ;LOOP HERE FOR SUCCESSIVE SECTOR READS DEC SECTCT ;ANY MORE SECTORS IN MODULE? BLT NXTB90 ;NO MORE: GO INIT FOR NEXT MODULE ;YES - READ NEXT SECTOR--- MOV #OBJLST,-(SP) ;DISC READ LIST EMT DISCIO ;****READ NEXT SECTOR**** TST OBJERR ;HERE WHEN BASIC RES'N TURNS OVER MOVB #$TMBAS,BASCNT ;RESET BASE PERIOD MULTIPLIER .ENDC $TMBAS INCB TIMBSY ;CHECK FOR PREVIOUS CALL STILL ACTIVE BNE TIMA00 ;YES: LEAVE INDICATOR SET TO SHOW ;PENDING REQUEST TO RUN; AND RETURN. SAVE ;NOT ACTIVE, SO SAFE TO ENTER. CALL TO ;SAVE ENVIRONMENT AND RETURN WITH: ;(R4 Q BE D?EAHR TNGRIDUY ANT ESQURE" METIDQ "ID;D AGFLDQ T TS D END EAHR T @N"IOUTOLES RNTREUR"CL IL;K S REUR,CC)(P VBMO D EAHR TONTILUSOREA F OND EATE ER;H : 90MBTI E AG.P S LEDUMOE OR MOR FCKBAP OO;L 15MBTI BR E)OVAB. LNXP EEE(SR TEINPOE ULOD METES;R 1 ,RR5 V MO: 70MBTI R0+,P)(S V MO R4+,P)(S V MO R5+,P)(S V MO CKTA SOMFRS ERSTGIRED VESAP PO ; INEG BLEDUMO= 1)(R T"LSXT"TTHWIE ITWRR OADREO ;G O TIEX,TPC R JS ADRET EX TEW NOR FREPARE;P .WTRTX RBCL S TERI WNTSQUB S &ADREG INOMPC UOR FET;S C SEXT,TR3 V MO E IL FCHAT BOFN GIBEO TVETILARER TOEC;S 3 ,RCTSEBF D AD ) GN BXTTEO TVETILARE (ORCTSEW NEE AV;S 4 ,RR3 V MO R3 R AS R3 R AS R3 R AS R3 R AS R3 R AS R3 R AS N IG SEDNDTEEXS ESPRUP;S R30,0000#1 # ;READ ERROR? BNE LDER01 ;YES INC OBJSEC ;BUMP SECTOR # FOR NEXT TIME SUB #128.,BLKPTR ;SHIFT POINTER BACK TO TOP SECTOR AREA .PAGE NXTB30: ;PREPARE TO FIND NEXT BLOCK START MOV BLKPTR,R0 MOV #OBJBK2,R1 ;TOP OF LOWER AREA SUB R0,R1 ;# BYTES REMAINING IN TOP SECTOR BR NXTB44 ;AVOID RESET "PTR1.0" IN CASE OF BLOCK BOUNDARY ; SEARCH FOR A "1-0"$) = (PS) BEFORE CLOCK INTERRUPT ;(R5) = ADDRESS OF "RESTOR" ROUTINE .PAGE TMNSRT: ;TIMER INSERT ROUTINE: TRANSFERS TIMER MODULE ADDRESS ; FROM WAIT STACK TO APPROPRIATE QUEUE WHEN CONVENIENT FOR TIMER. ; CPU LEVEL SEVEN: AVOID INTERFERENCE WITH "QTIME". MOV @TTBPTR,R0 ;ADDRESS OF TIMER MODULE FROM TOP OF ;"WAIT" STACK BEQ TIMA15 ;STACK EMPTY SUB #2. NERTR SE UTOK IN;L 3)(RRGTAJS,@PC R JS P)(S,-R5 V MO P)(S,-R4 V MO P)(S,-R0 V MO CKTA SONS ERSTGIRED DEEE NVESA ; D TEECEL SOT;N 70MBTI L BP N IG STOINT BIN IOPT OJ" "ET;G R2 LBAS : 60MBTI GSLA FOR FERNTOI PLEDUMOY ARNDCOSEP UM;B + 3)(R+,3)(R P CM ONTICALOG LA FTOINK AS MR"IO;" 3)(RAGFLTM,@3)(RSKMATI SBBI N IOPT OAGFLO ;N 60MBTI L BP GNSIO NT IIT BONTIOP C BI PCW NER FOR TOEC SET GOW;N R3 R AS C"RPCU "EW;N 3 ,RP)(S V MO T"LSXT"TTHWIE ITWRR OADREO ;G O TIEX,TPC R JS TERI;W W R.XT,T#1 VBMO - --INT EX TEW NADRED ANT OUT EX TNTREUR CTERI WTOE ER;H : 10TOTX E AG.P METIS HI TEDEDNER FENSRA TNO: ES;Y 40TOTX O BL 2? #BKW LOBET IIS: #1K BLE OVABC PEW;N 3 ,RP)(S P CM K COBLD ONEC SINE YT BSTIR FOFC ;P R3.,28#1 ' SEQUENCE TO START NEXT BLOCK NXTB40: MOV #ONEZRO,PTR1.0 ;INIT PTR TO [1] NXTB44: DEC R1 ;END OF TOP BLOCK YET? BGE NXTB46 ;NOT YET - KEEP GOING MOV R0,BLKPTR ;UPDATE FOR PROPER PLACE IN NEW BLOCK BR NXTB10 ;...AND GO MOVE NEXT BLOCK UP NXTB46: CMPB (R0)+,@PTR1.0 ;IS NEXT BYTE A MATCH FOR SEQUENCE? BNE NXTB40 ;NO MATCH - KEEP LOOKING INC PTR1.0 ;MATCH: BUMP TO NEXT(,TTBPTR ;NOT EMPTY: POP STACK ONE CELL MOV #1,(R0) ;SET T/W INACTIVE IN CASE WAS DE-QUEUED CMPB 5(R0),#-1 ;IS "RESET" ALL ONES? BEQ TMNSRT ;YES: MODULE WAS "DE-QUEUED": IGNORE IT MOVB 3(R0),R1 ;GET OPTION BYTE BIC #177760,R1 ;ISOLATE RESOLUTION CMP R1,#$NRES-1 ;IS RESOLUTION IN RANGE? BGT TMNSRT ;NO: TOO LARGE ASL R1 ;USED AS WORD INDE" AGFL "ET;G R2 LBAS: 56MBTI OT NORD SE UERTHHE WG,ARR VE OERNTOI PSSPA ;+ 3)(R T TS ET SOT NA";" 56MBTI L BP IT BGNSIO NT IONTIOP" RG"AE OV;M R2 LBAS D TELAREK-AS TOT NENWHE ER;H : 54MBTI DECON URET RORRR EOP;P + P)(S T TS ] NDSPUN [OR] UEUE[QR TEAFE ER;H : 50MBTI E EUQUL AL;C UEUE,QPC R JS E.ONT AS LUPD SE;U G AR DCEN . T ENUMRG ACEIN D AD T EX TCELAEP R -ES;Y 10TOTX O BL ? NE OCKLO BINT EX TOWEL BPCW NES ;I 4 ,RP)(S P CM R FENSRA TNOF OSECAN IPCUR C @R4P EE;K 3 ,RR4 V MO XTTET ENIDES ROFN BG@ E LUVAC ;P 4 ,RRGTOTX V MO OWEL BRKWOR FOE AV;S ) SP-(C,RPCU V MO CKLO BXTTET NXF OGN BTOR CTN C'LOP UM;B C RPCUC,TBTX D AD LLFUS IERFFBUF IXTTED TELAMUCUACT PUUT OTOE INUTROUB;S : UTTOTX ) T.EX TEDATRE CLYEW NUR O+ BYTE IN CODE BIT #1,PTR1.0 ;HAVE BOTH [1] AND [0] BEEN TESTED? BNE NXTB44 ;NO - CHECK FOR [0] .PAGE ; YEA! A [1-0] SEQUENCE HAS BEEN FOUND: NOW PROCESS BLOCK MOVB (R0)+,R1 ;BLOCK'S BYTE COUNT TSTB (R0)+ ;UPPER BYTE OF BC MUST BE ZERO BNE LDER02 MOV R0,R5 ;SAVE POINTER TO FIRST DATA BYTE ; NOW WANT TO COMPUTE CHECKSUM TO VERIFY CORRECT READ: MOV ,X BELOW MOV R0,@TLAST(R1) ;PUT NEW MODULE'S ADDR @ END PROPER THD> MOV R0,TLAST(R1) ;...AND UPDATE THE "LAST" POINTER ITSELF CLR (R0) ;CLEAR MODULE'S T/W: END OF THREAD BR TMNSRT ;NOW GO BACK AND POP ANY MORE MODULES .PAGE TIMA15: ;RE-ENTER HERE FOR REPEATS (TIMBSY>/=1) MOV R4,PS ;RESTORE PROCESSOR LEVEL TO PREVIOUS CLR R0 ;INIT RESOLUTION IND SDECON URET RSHPUT US;M ) SP-( R CL: 40MBTI RG AALTUACH IT WROZEE THE ACPLRE: ES;YP)(S),R3G(ARIM@T V MO O ;N 40MBTI Q BE S?AS PTOT ENUMRG AANE AV HLEDUMOS OE;D 2 ,R00#1 T BI UEUE QONT ENUMRG ASSPAO TONTIOPM TEYS;S RG A NZIF . TYPR D DCEN . .)ONS IONTIOPF IT,ENUMRG AEDSSPAR FOE ACSPK ACSTG INITINY BLSIOS P; O,ER ZOFE OD CRNTUREW NES HEUS PND ATYRIIOPRS AROZES VEEA LLYALTUAC (; Y ITORRI PEDGNSIASM-TEYS SSE;UOFY ITGRTEIN; HE TCTTERO PND AE,IM T AATR TOEC SNE OUT OXTTER OUR FEUF BAN CWE; Y,WAS HI TIN 1. #CKLO BTOINN AIAGN ICKBAD EA RBEO TLYON; C,IS DTON TEITWRE BLLWI2 #CKLO BXTTEN TEITWRY-LLIARTPAA T HA TANME; LLWIS HI TESAS CNYMAN I. IND EA RBEL IL WKSOCBLO TWW NEE ATRIOPPRAP; HE TND AT,OUN TEITWRE BLLWIS CKLO BTHBO, KSOCBLO TWE THE IDTSOU; R OK,OCBLD ONEC SHE TTOINS IPCW NEE THF I. URCC OLLWIR FENSRA TNO; 1, #CKLO BINTHWIS LLFAL ILSTC PEW NHE TIF D.ANMMCOD RLN ABYE LUVA; W NEA O / R1,R2 ;INIT CHECKSUM, WHICH INCLUDES BC SUB #4,R1 ;REDUCE BC TO ELIM "1-0" AND BC WORDS MOV R1,BC ;SAVE BYTE COUNT OF DATA ONLY NXTB50: MOVB (R0)+,R3 ;EXTRACT NEXT BYTE ADD R3,R2 ;ACCUM CHECKSUM DEC R1 ;MORE DATA BYTES TO ADD IN? ;BYTE COUNT INCLUDES CHECKSUM BYTE... BGE NXTB50 ;SO GO BACK FOR ONE EXTRA BYTE AT END IN0EX TIMA20: ;RETURN HERE WHEN ADVANCING TO NEXT RESN DECB CURTAB(R0) ;COUNT DOWN A RESOLUTION COUNTER BEQ TIMA70 ;EXPIRED: GO RESET IT & BUMP RES'N INDEX TIMA30: ;FALL THROUGH HERE WHEN A RESOLUTION COUNTER IS FOUND ; THAT HAS NOT EXPIRED. SINCE THE RESOLUTIONS ARE COUNTED STARTING ; FROM THE FINEST TOWARDS THE COARSEST, THE RESOLUTION CURRENTLY IN R0 ; IS THE FINEST RESOLUTION THAT HAS NOT EXPIRED. BY DECREMENTING R0, ; ) SP-( R CL ONTIOPS IEITORRI PICAMYN;D TYPR D NZIF . K.ACSTO NT OEDSHPUY ADREAL) TYRIIOPRD TENI IOR;( DECON URET RND A #SKTA K.AS T AUEUE QTOE ER;H : 30MBTI ONTIOPG LA FCKHE C &RDWOR ROERP POO ;G 50MBTI BR " NDPEUS-SUN "TOL AL;C D PNNS,UPC R JS G INUEUE QDOO GO:;N 30MBTI L BP D?TEECEL SONTIOP" NDPEUS"SS ;I R2 TBTS ].UEUE[QR FOD DEEE NIFY ITORRI POFT NI TET SENBES HA" PCUR"CS TECADIINH ICWH, ROZEE BAY MC"TBTX("; " T U O T X T " ; E AG.P T EX TTHWIR ROERO CIIS;D T PRRR,EPC R JS 4 ,R#5 V MO: 05ERLD PC S RT 05ERLD E BN S?ORRR ENY;A RRTETX T TS T EX TTHWIE ITWRR OADREO ;G IOSCDI T EM ) SP-(T,LSXT#T V MO: IOXTTE ******************************************************************** ; R LEAL CUR OTON URET RENTHL IL WCHHI;W 3CB R2 ;CHECKSUM ITSELF INCLUDES THE "1" @BEGIN BNE LDER03 ;CHECKSUM ERROR MOV R0,BLKPTR ;ADVANCE BLK PTR-READY FOR NEXT BLOCK MOV R5,R0 ;RESET LOCAL PTR TO FIRST DATA BYTE BIT #1,R0 ;IS ADDR OF FIRST DATA BYTE ODD? BEQ NXTB70 ;EVEN: NO RELOCATION NEEDED MOV BC,R3 ;NEED TO MOVE ALL BYTES BACK ONE NXTB60: MOVB (R0)+,-2(R0) ;SHIFT BYTE BACK ONE 4 THE COARSEST RESOLUTION TO EXPIRE IS FOUND. FALLS THROUGH HERE ALSO ; IF ALL RESOLUTIONS EXPIRE, WHICH WILL HAPPEN FROM TIME TO TIME. ASL R0 ;RESOLUTION*2: USE AS WORD INDEX TIMA35: ;LOOP BACK HERE FOR SUCCESSIVE RESOLUTIONS DEC R0 DEC R0 ;COUNT DOWN RESOLUTION INDEX (TWICE, ; SINCE IT WAS MADE INTO A WORD INDEX ABOVE). ON THE FIRST PASS AFTER ; FINDING THE FIRST RES'N NOT TO EXPIRE, THIS BRINGS COUNTER BACK TO ; ;I OR, THBOR FOT ESQUREN URET RTEIAEDMM;I ) SP-( R CL STIR F #SKTAH US;PP)(S,-3)(RNOSKTA VBMO ] UEUE[QR OD]ENSPSU;[ R HEIT ETOL AL COR FCKTA SUPT SE: ES;Y NSIOPT OERTH OOR FCKHE CO:;N 54MBTI Q BE D?TELAREK-AS TLEDUMOS ;I 3)(RNOSKTA TBTS LEDUMOS HI TOR FTEBYN IOPT OET;G 2 ,R3)(RONTIOP VBMO OW NFESA: TSUPRRTEINK OCNL;U E AGSSMET INPR: ROZET NOS WAE YT BERPP;U 25ERLD BR ROZEE BTOD HAE YT BERPP;U 10TPTX Q BE R4 ABSW: 20TPTX PC S RT: 10TPTX TEBYR PEUPD OA;L )+R3,(R4 VBMO R4 ABSW E YT;B 20TPTX I BM NDMAOM;C R2 T TS T EX TTOINE YT BSTIR FCELA;P )+R3,(R4 VBMO . TSBI8 W LORFVE OOT NID DTEBYD KEIN L ARESUE BTOE AD MISK ECCH ; . XTTEO NT IRDWOR OTEBYD KEIN L7 DEC R3 ;MORE BYTES TO MOVE? BGT NXTB60 ;YES MOV R5,R0 DEC R0 ;NOW POINTS TO FIRST DATA BYTE NXTB70: MOV BC,R5 ;INIT R5 WITH DATA BYTE COUNT ADD #2,(SP) ;BUMP FOR "GOOD" RETURN NXTB80: RTS PC ; ******************************************************************** LDER01: MOV #1,R4 ;OBJ MODULE BLOCK READ ERROR JSR PC,ERRPRT LDER02: MOV #2,R4 8 (DOUBLE) THE COARSEST RES'N TO EXPIRE. ON SUCCESSIVE PASSES THIS ; MOVES TO NEXT FINER RES'N FOR SERVICING. BLT TIMEXT ;EXIT HERE WHEN ALL RESOLUTIONS HAVE ; BEEN SERVICED, OR IF NO LEVELS ACTUALLY EXPIRED. .PAGE TIMB10: ;NOW WE BEGIN TRAVELING THE THREADS ;ALSO LOOP RE-ENTRY POINT FOR EACH RESOLUTION MOV #TFIRST,R1 ;CALC ADDRESS IN THE QUEUE POINTER TABLE ADD R0,R1 ;...OF POINTER S ,PR4 V MO: 20MBTI LEDUMOM EATRPS UTOR TEINPOK AC;B 5 ,RR2 V MO SECAR HEIT EINE IVCTNA IRDWOD EAHR TET;S ) R1,(#1 V MO: 22MBTI D ENS WAF IERNTOI PT"AS"LE ATPD UUT;B 0)(RSTLA,TR2 V MO STLAT NOF ICHANBR ".NGGIIDBR "BY..;. 22MBTI E BN . ..D EAHR TOMFRE OVEM R":OTSHE-ON;" ) R2,(1)(R V MO ADRETHN IVEEA LR:TEEAEP R AISE ULOD;M 20MBTI E BN TEBYR METIT SERE ; 1)(RYTMBTI),R1T(SERE VBMO UT PTOE INUTROUB;S : UTTPTX E AG.P T PRRR,EPC R JS T"LSRA"TH IT WIOSCDIN IORRR;E 4 ,R#6 V MO: 06ERLD PC S RT IOSCDIN IRR;E 06ERLD E BN RRAETR T TS T IS LERILRA TTHWIE ITWRD/EA;R IOSCDI T EM R LEAITRR FOT IS;L ) SP-(T,LSRA#T V MO CKLO BILRA THE TOMFRO/ TTERI WORD EA RTOE INUTROUB;S O:LIAITR PC S RT ERNTOI PEW;NR TEINPOILRA,TR5 V MO: 30APTR R TEINPOT SEREO ; ;BLOCK BYTE COUNT ERROR JSR PC,ERRPRT LDER03: MOV #3,R4 ;OBJ MOD BLOCK CHECKSUM ERROR JSR PC,ERRPRT .PAGE ; " T R A P U T " ; SUBROUTINE PUTS AN "ADD R1,LOC" TWO-WORD INSTRUCTION IN THE TASK ; TRAILER, TO BE EXECUTED WHEN THE LOAD MODULE IS READ INTO CORE PRIOR ; TO TASK EXECUTION, THUS EFFECTING DYNAMIC RELOCTTION. THE SUBROUTINE ; CALCULATES THE PROPER DISPLACEMENT BETWEEN THE INSTRUCITON AND "LOC", ; THE WORD IN THE TEXT NEEDING< FOR CURRENT RESOLUTION TIMB15: ;LOOP HERE FOR EACH SUCCESSIVE MODULE MOV #340,PS ;AVOID INTERFERENCE WITH "DQTIME" MOVB R0,CURRES ;INIT "CURRENT RESOLUTION" BEFORE BEGIN TIMB16: ;LOOP RE-ENTRY POINT MOV R1,R2 ;REMEMBER UPSTREAM MODULE ADDRESS... ;...FOR USE IN DE-QUEUEING "ONE-SHOTS" MOV (R1),R1 ;NEXT MODULE'S THREAD WORD ADDRESS W LOBET SERE1 ROR FEPPRN IR5T NI;I 5 ,RR1 V MO ERNTOI PSTLIC MINADYS AR3T NI;I 3 ,RR1 V MO . ISTHW LOALO TOPLOE THF OND EHE TAT5 ROMFRD DEOA LIS1 R. ADRETH; HE TOMFRD VEMORES IND AT"HO-SNE"OA S ILEDUMOT ENRRCUE THE AS CIN; E ULOD MAMRESTUPE THO TNTOI PTOT SERES IR5D AN, ERNGLOT IS LHE TKEMA; H ICWHS ERMTRAPAL NAIOPT OOR FTESAENMPCOO TLEDUMOE THN OW DESOV MR3; D:DEEE NRE ARSTEINPOR HEOTO TWT BU N.RUS INETIOU RLEIBSSPOE THL TIUN; H UC SAS TREPARE;P R5K,OCBLILRA#T V MO R BEUM NORCTSER LEAITRP UM;B ECASTR C IN: 20APTR CKLO BERILRA TNTREUR CUT OTERI;W IOILRA,TPC R JS ET YOT;N 30APTR O BL ? ET YCKLO BOFD ENT ;A . 28+1CKLOLBAITR,#R5 P CM O: SIFT OUT ITERI WND AL,UL FISR FEUF BIFE SEW NO ; D"AD "NDHIBET ICKTI;S )+R5,(R4 V MO OT NC"APTR "UT BD,CEANDV AIS" PC "CEIN;S 4 ,R#2 B SU T ENEMACPLIS DRDWACKBAC AL;C R4C,? DYNAMIC RELOCATION. THE FORMULA FOR THE ; DISPLACEMENT BETWEEN THE "ADD" INSTRUCTION AND ITS OBJECT IN THE LOAD ; TEXT IS: DISPL = CURPC + OFFSET - TRAPC ; THIS DISPLACEMENT IS NEGATIVE, SINCE ALL REFERENCES FROM THE TRAILER ; WILL BE BACKWARD. SUBPUT: MOV #160167,-(SP) ;STACK "SUB R1,LOC" INSTRUCTION BR TRAPUT ADDPUT: MOV #60167,-(SP) ;STACK "ADD R1,LOC" INSTRUCTION TRAPUT: ;SUBROUTINE TO BUILD TRAILER JSR PC,TXTPUT BEQ TIMB90 ;END OF THREAD: GO CHECK FOR DE-QUEUE CMPB RESET(R1),#377 ;IF MODULE IS FLAGGED... BEQ TIMB16 ;...DON'T EXECUTE IT. DECB TIMBYT(R1) ;COUNT DOWN MODULE'S TIMER BNE TIMB16 ;NOT EXPIRED: GET NEXT MODULE ;TIMER EXPIRED! IT IS MODULE'S TIME. ; SINCE COMPLETION ROUTINES RUN UNDER THE "J" OPTION ASSUME R1 POINTS TO ; THE CURRENT MODULE (IT'S THREAD WORD), R1 MUST BE PRESERVED APTR B SU T SEFF OADLOT ENRRCUF OUEAL VET;G PCET,GPC R JS R LEAITRO NT IONTIUCTRNS IEDCKTA SUT;P + 5)(R+,P)(S V MO T LO SERILRA TENOPT EX;N5 ,RERNTOILPAITR V MO 1.S HI TERFT ALLCEN PE OXTNEO TCEANDV;A PCRA,T#4 D AD: 10APTR E AG.P " UTTPTX "TOR O",UTDPAD;" ",UTBPSU "TOR HEIT EDEMAS WAL AL;C PC S RT T PRRR,EPC R JS ORRR EONTICALOREE YT;B 4 ,R0000105+#2 V ;FIRST PUT ALTERED WORD INTO TEXT TST ABSVAL ;THIS SYMBOL RELOCATABLE? BNE TRAP05 ;YES: DO TRAILER UNLESS A BYTE TST (SP)+ ;NO TRAILER FOR ABSOLUTE GLOBALS... RTS PC ;...SO POP STACKED INSTRUCTION & RETURN TRAP05: TST R2 ;WAS THIS A "BYTE" COMMAND? BPL TRAP10 ;WORD: OKAY TO ADD TO TRAILER TST (SP)+ ;POP STACKED INSTRUCTION LDER25: MO