; DDCGTP.S08 TEST DDC SET IN BYTE 0 OF SW REG , BACKGROUND BYTE 1 OF S ; DDCGTP.S07 11-SEP-73 ; DDCGTP.S06 ; DDCGTP.S05 ; DDCGTP.S04 ; DDCGTP.S03 AUG-28-73 ; DDCGTP.S02 ; DDCGTP.SO1 AUG-24-73 ; DDCGTP.S00 AUG-21-73 .TITLE DDCGTP ( D D C GENERAL TEST PROGRAM ) BIT0=1 BIT1=2 BIT2=4 BIT3=10 BIT4=20 BIT5=40 BIT6=100 BIT7=200 BIT8=400 BIT9=1000 BIT10=2000 BIT11=4000 BIT12=1000; MAGTAP.S15 ; MAGTAP.S14 ; MAGTAP.S13 ; MAGTAP.S12 ON TAPE 124 12 MAR 73 .TITLE MAGTAP ;********************************************************************** ;* M A G T A P ** ;* ** ;* PROGRAM IDENTIFICATION. MAGTAP - MAGNETIC TAPE INTERFACE ** ;* SUBROUTINE ** ;*  .TITLE MACT ; PROGRAMMER 67 ; E M T EQUATES IOE$ = 101 QUEE$ = 1 SUSE$ = 2 UNSE$ = 3 EXTE$ = 4 BTAE$ = 16 ATBE$ = 17 CKPE$ = 27 NCKE$ = 30 GTIE$ = 31 GDAE$ = 32 ASRE$ = 46 RACE$ = 47 MSKE$ = 53 UNME$ = 54 GJDE$ = 70 OPNE$ = 101 CLSE$ = OPNE$ + 1 INPE$ = CLSE$ + 1 OUTE$ = INPE$ + 1 REWE$ = OUTE$ + 1 FSRE$ = REWE$ + 1 BSRE$ = FSRE$ + 1 FSFE$ = BSRE$ + 1 BSFE$ = FSFE$ + 1 EOFE$ = BSFE$ + 1 QTME$ = 113 DQTE$ = QTME$ + 1 QSKE$ = DQTE$ + 1 DQSE$ = QSKE$ + 1 .;}J(H;}Jh(i.<<%%" %5< <a.& 7 6PY6&P!.LP LINE PRINTER TEST MESSAGE FOR.r TASK 61 123456789 ABCDEFGHIJ0LINE P.RINTER TEST MESSAGE FOR TASK 61 1234.56789 ABCDEFGHIJ1LINE PRINTER TEST MES$.SAGE FOR TASK 61 123456789 ABCDEFGHI. J2LINE PRINTER TEST MESSAGE FOR TASK 6 01 123456789 0 BIT13=20000 BIT14=40000 BIT15=100000 R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 SREQ = 177570 ; SWITCH REGISTER EQUATE NO = 67 ; WRITE=TRAP+3 WRCHECK=TRAP+7 READ=TRAP+5 ; ; ;DDC DATA TEST PROGRAM ;VECTORS USED IN PROGRAM ;#1 LOC 130,134,140,144,150,154,160,164 DISK INTERRUPT ;#2 LOC 30 EMT (TELETYPE OUTPUT) ;#3 LOC 34 TRAP (DISK HANDLERS) ;#4 LOC 14 TRACE TRAP (USED IN BACKGROUND TEST) ;#5 LOC 20 IOT TRAP (USED IN CALLING BACKGROUND TES ** ;* PURPOSE. ALL COMMUNICATIONS WITH THE MAGNETIC TAPES WILL ** ;* BE THROUGH THIS SUBROUTINE. THIS ROUTINE PERFORMS THE ** ;* FOLLOWING MAGNETIC TAPE FUNCTIONS: ** ;* 1 OPEN (RETURN STATUS) ** ;* 2 CLOSE (NO OPERATION) ** ;* 3 READ ** ;* 4 W R$ = 117 RES$ = 120 Q$ = 121 GETE$ = 122 PUTE$ = 123 SGLE$ = 124 ; I/O CONTROL LIST OFFSET EQUATES $LUN = 4 ; LOGICAL DEVICE NUMBER, FILE NUMBER OR NAME $PRI = $LUN + 2 ; I/O CALL PRIORITY $EX = $PRI + 1 ; CALL TYPE (SEQUENTIAL, NON-SEQ, ETC.) $ERWD = $EX + 1 ; CALL OR I/O ERROR CODE (SET BY ROS) $NR = $ERWD + 2 ; POINTER TO NORMAL RESUME LOCATION AFTER I/O $ER = $NR + 2 ; POINTER TO ERROR RESUME LOCATION AFTER I/O $MOD = $ER + 2 ; MODE OF TRANSFER (ASCII, BINARY, HABCDEFGHIJf T) ; ;I/O ADDRESS POINTERS SR: 177570 ;SWITCH REGIISTER CSR: 177776 ;PROCESSOR STATUS REGISTER TPB: 177566 ;TELETYPE REGISTERS TKB: 177562 TPS: 177564 TKS: 177560 ; ;DISK I/O REGISTERS ; DCS: 177460 ;DISK CONTROL REGISTER WC: 177462 ;WORD COUNT REGISTER CMA: 177464 ;CURRENT ADDRESS REGISTER DAR: 177466 ;LOWER 16 BITS OF DISK ADDRESS DAE: 177470 ;EXTENSION ADDRESS REGISTER DBR: 177472 ;DATA BUFFER REGISTER MA: 177474 ;MAINTENANCE REGISTER ADS: 177476 ;LOOK AHEAD RRITE ** ;* 5 WRITE FILE MARK ** ;* 6 REWIND ** ;* 7 SPACE (+-N) RECORDS ** ;* 10 SKIP (+-N) FILES ** ;* ALL THREE STANDARD R0S I/O EXITS ARE SUPPORTED BY MAGTAP. ** ;* ** ;* USAGOLLERITH) $FCT = $MOD + 1 ; FUNCTION CODE $NW = $FCT + 1 ; NUMBER OF WORDS TO BE TRANSFERED $ANW = $NW + 2 ; ACTUAL NUMBER OF WORDS TRANSFERED $BUF = $ANW + 2 ; POINTER TO DATA BUFFER $ACC = $BUF + 6 ; ACCESS REQUESTED $BLU = $ACC + 2 ; BACKUP LOGICAL DEVICE NO. OR FILE NO. $REC = $BLU + 2 ; LOGICAL RECORD NUMBER $CBN = $REC + 4 ; CURRENT RECORD FIRST BLOCK NUMBER $CRL = $CBN + 2 ; CURRENT RECORD LENGTH $PBN = $CRL + 2 ; PREVIOUS RECORD FIRST BLOCK NUMBER $PRL = $PBN + 2 ; PR ; ; JMP PFT1 ;DISK WRITE POWER FAIL TEST ; ; JMP PFT2 ;DISK WRITE CHECK POWER FAIL TEST ; ; ;***MAINTENANCE ROUTINES*** ; ; JMP SELWC ;LOAD WORD COUNT REG. ;WITH SWITCH REGISTER ; ; JMP SELCMA ;LOAD CURRENT MEMORY ADDR ;REG. WITH SWITCH REGISTER ; ; JMP SELDAR ;LOAD DISK ADDR. REGISTER ;WITH SWITCH REGISTER ; ; JMP SELDAE ;LOAD DISK ADDR. EXT. ;WITH SWITCH REGISTER ; ; JMP SELDBR ;LOAD DATA BEGISTER VECTOR: 204 ;INTERRUPT VECTOR ADDRESS STATUS: 206 ;DISK INTERRUPT STATUS PRIORITY:BIT7 ;DISK PRIORITY LEVEL ; ; ; ; ; ; ;RF11 DEDICATE REGISTERS (MEMORY) ; FLAG: 0 ;INTERNAL PROGRAM FLAG RANNU: 146723 ;RANDOM NUMBER PRIME WRDCT: 0 ;WORKING WORD COUNT TRACK: 0 ;WORKING DAE DMA: 0 ;WORKING DAR PATNU: 0 ;DATA PATTERN INDEX BUF: 0 ;WORKING DATA BUFFER (OUT-IN) TWRDCT: 0 ;TEMP WORD COUNT TDMA: 0 ;TEMP DAR SWRDCT: 0 ;STANDARD WORD COUNT ERCOUNT:0 ;ERROE. THE ASSEMBLER LINKAGE TO MAGTAP IS: ** ;* ** ;* MOV #LIST,-(SP) ;PUSH LIST ADDRESS ON STACK ** ;* EMT MAGTAP ** ;* ** ;* THE FORTRAN EQUIVALENT CALL IS: ** ;* ** ;* EVIOUS RECORD LENGTH $NBN = $PRL + 2 ; NEXT RECORD FIRST BLOCK NUMBER $NRL = $NBN + 2 ; NEXT RECORD LENGTH SP = %6 PC = %7 .REF GETBLK CLQ: NOP CLER1: NOP ERRR: NOP RTN1: NOP ERR1: NOP .PAGE .MACRO ERPR LST,CLER .IF NB LST MOV (SP)+,LST+$ERWD ; SAVE RETURNED CODE .IFF #; LIST ADDRESS IS REQUIRED .ENDC .IF NB CLER BEQ .+4 JMP CLER ; GO TO ERROR PROCESSOR .IFF #; ERROR PROCESS MUST BE SPECIFIED .ENDC .ENDM ERPR .MACRO ERRM CLER TST (SP)+ UFFER REGISTER ;WITH SWITCH REGISTER ; ; JMP MOVLK ;MOVE CONTENTS OF LOOK ;AHEAD REGISTER INTO DATA LIGHTS ; ; JMP SELDCS ;LOAD DISK CONTROL REGISTER ;WITH SWITCH REGISTER ; ; JMP STAMP ;ENABLE READ AMPLIFIERS ;TO TRACK SELECTED ;FROM SWITCH REGISTER ; ; ; ; ; ; ; ; ;RF11 DATA TEST ;VECTORS USED IN PROGRAM ;#1 LOC 204 DISK INTERRUPT ;#2 LOC 30 EMT (TELETYPE OUTPUT) ;#3 LOC 34 TRAP (DISK HANDLERS) ;#4 LOC 14 TRACE TRAP (UR COUNT FOR MESSAGES. SAVE: 0 SAV1: 0 PASS: 0 DSKNOR: 0 ;NUMBER OF DISKS ON THE SYSTEM HRDER: 0 ;POINTER FOR HARD ERROR PASSC: 0 ; ;RF11 WORK REGISTERS ;(CAN BE CHANGED IN ANY ROUTINE) WORK: 0 WORK1: 0 WORK2: 0 WORK3: 0 WORK4: 0 WORK5: 0 BEGIN: RESET CLR R0 ; CLEAR INTERRUPT VECTORS MOV #2,R1 MOV #4,R2 1$: MOV R1,(R0) ; SET INTERRUPT VECTOR TO .+2 CLR (R1) ; HA CALL MAGTAP(IADDR(LIST)) ** ;* ** ;* THE FORMAT OF THE LIST IS AS FOLLOWS: ** ;* ** ;* LIST THREAD ** ;* +2 EXIT TYPE (1 OR 2) DEVICE TYPE (MAG TAPE=4) ** ;* +4 EXIT ADDRESS (EXIT TYPE 3 ONLY) * .IF NB CLER BEQ .+4 JMP CLER .IFF #; ERROR LOCATION MUST BE SPECIFIED .ENDC .ENDM ERRM .MACRO SPM$ LST .LIST MEB .IF NB LST MOV #LST,-(SP) ; PLACE ON STACK .IFF #; PARAMETER IS REQUIRED .ENDC .ENDM SPM$ .MACRO SPD$ LST .IF NB LST MOV #LST,-(SP) ; PLACE ON STACK .IFF #; PARAMETER IS REQUIRED .ENDC .ENDM SPD$ .MACRO STP$ VAR,CNT .IF NB VAR TEMP$ = TEMP$ + CNT .ENDC .ENDM STP$ .MACRO SLP$ PAR,LST,OFS .IF NB PAR MOV #PAR,LST+OFS ; SSED IN BACKGROUND TEST) ;#5 LOC 20 IOT TRAP (USED IN CALLING BACKGROUND TEST) .=1000 .EVEN ; ;I/O ADDRESS POINTERS SR: 177570 ;SWITCH REGIISTER CSR: 177776 ;PROCESSOR STATUS REGISTER TPB: 177566 ;TELETYPE REGISTERS TKB: 177562 TPS: 177564 TKS: 177560 ; ;DISK I/O REGISTERS ; DCS: 177460 ;DISK CONTROL REGISTER WC: 177462 ;WORD COUNT REGISTER CMA: 177464 ;CURRENT ADDRESS REGISTER DAR: 177466 ;LOWER 16 BITS OF DISK ADDRESS DAE: 177470 ;EXTENSION ADDRESS REGISTER DBR: 1LT 3$: ADD R2,R0 ADD R2,R1 CMP #14,R0 ; 14 & 16 ARE NEEDED FOR ODT BEQ 3$ CMP #200,R0 ; DONE BNE 1$ ; NO ; BACKGROUND TEST VECTOR MOV #XWAIT,@#20 CLR @#22 ; SET EMT TRAP VECTOR MOV #EMTRP,@#30 ; TTY VECTOR MOV #340,@#32 MOV #DISK,@#34 ; DISK CALLING VECTOR MOV #340,@#36 ; SET UP INTERR* ;* +6 PRIORITY LEVEL DEVICE NUMBER (0 OR 1) ** ;* +10 RETURN ERROR PARAMETER (0 TO 14) ** ;* +12 SYSTEM (CALLING TASK #) ** ;* +14 DATA BUFFER ADDRESS ** ;* +16 SYSTEM ** ;* +20 SYSTEM ** ;* +22 FUNCTION (CODES LISTED ABAVE PAR IN LIST .ENDC .ENDM SLP$ .MACRO SLH$ PAR,LST,OFS .IF NB PAR MOVB #PAR,LST+OFS SAVE PAR IN LIST .ENDC .ENDM SLH$ .MACRO SRS$ PAR .IF NB PAR MOV (SP)+,PAR ; REMOVE FROM STACK .IFF #; PAR IS REQUIRED .ENDC .ENDM SRS$ .PAGE ; Q$ QUEUE TASK MACRO REQUEST WITHOUT USEING DYNAMIC FREE CORE .MACRO Q$ LIST,CLER SPM$ LIST EMT QUEE$ ERPR LIST,CLER .NLIST MEB .ENDM Q$ Q$ LSQ,CLQ .PAGE ; QUE$ QUEUE TASK MACRO REQUEST USEING DYNAMIC FREE C(; UPDATE 3/07/73 ASCBIN.S11 ; UPDATE 3/05/73 ASCBIN.S10 GSJ ; UPDATE 8/23/72 ASCBIN.S09 ; UPDATE 8/15/72 ASCBIN.S08 .TITLE ASCBIN ;*********************************************************************** ; ; ASCBIN, CATALOG NUMBER ,ASCII ; TO BINARY CONVERSION SUBROUTINE. ; ; THIS SUBROUTINE WILL CONVERT A SIGNED OR UNSIGNED ; INTEGER ASCII DECIMAL STRING STORED IN A ; SIX BYTE ARRAYUPT VECTORS FOR D.D.C. DISK MOV @#SREQ,R0 ; GET DISK NUMBER FROM BIC #177770,R0 ; BITS 0-2 OF SWITCH REGISTER ASH #2,R0 ; MULT BY4 ADD #130,R0 ; ADD IN VECTOR ADDRESS FOR UNIT 0 MOV R0,R1 ADD #2,R1 2$: MOV #DKINT,(R0) ; INTERRUPT ROUTINE MOV #200,(R1) ; PSR ADD R2,R0 ADD R2,R1 CMP #170,R0 ; DONE BNE OVE) ** ;* +24 NWORD ** ;* +26 COUNT ** ;* +30 STATUS ** ;* +32 -BACKSPACE FLAG REPEAT COUNT ** ;* +34 RESERVED ** ;* +36 RESERVED ** ;* ORE .MACRO QUE$ LST,CLER SPM$ LST JSR PC,GETBLK ; PUBLIC LIBRARY SUBROUTINE EMT QUEE$ ERPR LST,CLER .NLIST MEB .ENDM QUE$ QUE$ LSQ,CLQ .PAGE ; QL$ TASK QUEUE DEFINITION MACRO .MACRO QL$ LIST,TSKN,PRIR,EXTY,ERES,NRES,BUF1,N1,BUF2,N2,ARG1,ARG2 .LIST MEB .BOUND .IF NB LIST LIST: .WORD 1 ; THREAD WORD .IFF # ; LIST ADDRESS MUST BE SPECIFIED .ENDC .WORD 0 ; CALLING TASK'S NUMBER .IF NB TSKN .WORD TSKN ; CALLED TASK'S NUMBER .IFF # ; CALLED TASK OVE) ** ;* +24 NWORD ** ;* +26 COUNT ** ;* +30 STATUS ** ;* +32 -BACKSPACE FLAG REPEAT COUNT ** ;* +34 RESERVED ** ;* +36 RESERVED ** ;* !2$ ; NO ; SET UP START ADDRESS MOV #137,@#200 ; JMP MOV #START,@#202 ; SET UP JUMP INSTRUCTIONS MOV #600,R0 MOV #137,(R0)+ ; JMP MOV #ADT2,(R0)+ ; EXTRANEOUS DATA ALTERATION TEST MOV #137,(R0)+ ; JMP MOV #ADT3,(R0)+ ; SECTOR ADDRESSING TEST MOV #137,(R0)+ ; JMP MOV #ADT4,(R0)+ ; TRACK ADDRESSING TEST MOV #137,(R0)+ " ** ;* THE RETURN ERROR CODES ARE AS FOLLOWS: ** ;* ** ;* 0 I/O SUCCESSFUL ** ;* 1 LIST ALREADY IN A QUEUE ** ;* 2 INVALID DEVICE TYPE ** ;* 3 ILLEGAL EXIT TYPE ** ;* 5 ILLEGAL DEVICE NUMBER #'S NUMBER MUST BE SPECIFIED .ENDC .IF NB PRIR .BYTE PRIR ; PRIORITY .BYTE EXTY ; EXIT TYPE .IFF # ; PRIORITY MUST BE SPECIFIED .ENDC .WORD 0 ; CONTAINS ERROR CODE .WORD NRES ; NORMAL RESUME LOCATION OR 0 .WORD ERES ; ERROR RESUME LOCATION OR 0 .BYTE N1 ; NUMBER OF ARGUMENTS SENT, 0, OR 1ST ARGUMENT .BYTE N2 ; NUMBER OF ARGUMENTS TO RECEIVE, 0, OR 2ND ARG .WORD BUF2 ; POINTER TO RECEIVING BUFFER, 0, OR 3RD ARG .WORD BUF1 ; POINTER TO SENDING BUFFER, 0, OR 4TH ARGUMENT .$ ** ;* THE RETURN ERROR CODES ARE AS FOLLOWS: ** ;* ** ;* 0 I/O SUCCESSFUL ** ;* 1 LIST ALREADY IN A QUEUE ** ;* 2 INVALID DEVICE TYPE ** ;* 3 ILLEGAL EXIT TYPE ** ;* 5 ILLEGAL DEVICE NUMBER %; JMP MOV #ADT5,(R0)+ ; LOOK AHEAD REGISTER TEST MOV #137,(R0)+ ; JMP MOV #SPIRAL,(R0)+ ; SEQUENTIAL TRACK ADDRESSING FOR READ MOV #137,(R0)+ ; JMP MOV #XSPIRL,(R0)+ ; SEQUENTIAL TRACK ADDRESSING FOR WRITE MOV #137,(R0)+ ; JMP MOV #RANEX,(R0)+ ; DATA PATTERN TEST (WITH OPTIONAL BACKGROUND) MOV @#SREQ,R0 ; SET UP UNIT NUMBER MOV #DCS,R2 ; SET FIRS& ** ;* 10 ILLEGAL I/O FUNCTION CODE ** ;* 11 FATAL HARDWARE ERROR, STATUS REG IS IN WORD 13 ** ;* 12 MAGNETIC TAPE TIME OUT ** ;* 14 WRITE COMMAND FOR REAL WITHOUT WRITE RING ** ;* ** ;* COUNT =NUMBER OF WORDS READ BY THE READ COMMAND ** ;* =NUMBER OF RECORDS (+-'WORD ARG1 ; 0 OR ARG .WORD ARG2 ; 0 OR ARG .NLIST MEB .ENDM QL$ QL$ LSQ,12,5,2,ERQ,NRQ NRQ: NOP ; NORMAL RETURN ERQ: NOP ; ERROR RETURN .PAGE ; R$ RESUME TASK MACRO FOR METHOD 1 & 2 .MACRO R$ CLER .LIST MEB EMT R$ ERRM CLER .NLIST MEB .ENDM R$ R$ CLER1 .PAGE ; RES$ RESUME TASK MACRO FOR METHOD 3 .MACRO RES$ LST,CLER SPM$ LST EMT RES$ ERPR LST,CLER .NLIST MEB .ENDM RES$ RES$ LSR,CLQ .PAGE ; RESL$ RESUME TASK LIST MACRO .M* ** ;* 10 ILLEGAL I/O FUNCTION CODE ** ;* 11 FATAL HARDWARE ERROR, STATUS REG IS IN WORD 13 ** ;* 12 MAGNETIC TAPE TIME OUT ** ;* 14 WRITE COMMAND FOR REAL WITHOUT WRITE RING ** ;* ** ;* COUNT =NUMBER OF WORDS READ BY THE READ COMMAND ** ;* =NUMBER OF RECORDS (+-)T REGISTER ADDRESS JSR PC,SETREG ; REGISTERS MOV @#SREQ,R0 SWAB R0 MOV #RDCS,R2 JSR PC,SETREG HALT START: RESET ;CLEAR THE WORLD MOV #1000,%6 ;SET UP STACK MOV #340,@CSR ;LOCK UP INTERRUPT LEVELS CLR FLAG ;CLEAR PROGRAM FLAG CLR TRACK ;CLEAR TRACK REGISTERS CLR DMA ;CLEAR DAR REGISTERS CLR PATNU ;CLEAR PATTER COUNT MOV #1000,SWRDCT ;SET UP STANDARD WORD COUNT MOV SWRDCT,WRDCT TST @SR BMI CONM *N) TO SPACE ** ;* =NUMBER OF FILES (+-N) TO SKIP ** ;* =UNUSED FOR ALL OTHER FUNCTIONS ** ;* ** ;* PROGRAMMER: 67 ** ;* DATE 10.04.72 ** ;* ** ;* +ACRO RESL$ LST,TSKN,PROC,NN,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6 .BOUND .LIST MEB LST: .WORD 1 ; THREAD WORD .IF NB TSKN .WORD TSKN ; NUMBER OF TASK TO BE RESUMED .IFF # ; TASK NUMBER MUST BE SPECIFIED .ENDC .IF NB PROC .WORD PROC ; ERROR RETURN IF NO MORE CORE BLOCKS .IFF # ; ERROR RETURN MUST BE SPECIFIED .ENDC .WORD NN ; NUMBER OF ARGUMENTS PASSED .WORD ARG1 ; ARGUMENT 1 .WORD ARG2 ; ARGUMENT 2 .WORD ARG3 ; ARGUMENT 3 .WORD ARG4 ; ARGUMENT 4 .WORD ARG5 ; ARGUMENT 5 ,, 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 ; ; WHERE: #STRING=ADDRESS OF ASCII BYTE STRING ; -;OPERATE UNDER PROGRAM CONTROL BIS #70000,FLAG JMP ADTST ;ENTER OPERATOR CONVERSATION MODE CONM: EMT +1 ;ASK ABOUT DATA TEST ONLY CON1 JSR %7,ALPHA ;GO WAIT FOR ANSWER CMP #153,TEXBUF ;TEST FOR YES BNE 2$ ; BRANCH IF NOT YES BIS #BIT10,FLAG BR 4$ 2$: CMP #67,TEXBUF ; TEST FOR NO BNE CONM ; TRY AGAIN IF NEITHER YES OR NO 4$: EMT +1 CON2 ;ASK ABOUT MULTI DISK MODE JSR %7,ALPHA ;GO WAIT FOR ANSWER . GULF ELECTRONIC SYSTEMS ** ;* ** ;********************************************************************** ; ; D E F .GLOBL MAGTAP,MTINT ; R E F .GLOBL PUSHR,POPR .GLOBL ACTIVE,$CTASK .GLOBL IOSTAT,DSPTCH .GLOBL RESTOR,RELTSK .GLOBL UNSPND,QSAVEI ; ; STANDARD REGISTER DEFINITIONS R0 = %0 R1 = %1 R2 = / .WORD ARG6 ; ARGUMENT 6 .NLIST MEB .ENDM RESL$ RESL$ LSR,42,ERRR,3,ARR1,ARR2,ARR3 ERR: NOP ARR1: .WORD 10 ARR2: .WORD 20 ARR3: .WORD 30 .PAGE ; SUS$ TASK SUSPEND MACRO .MACRO SUS$ .LIST MEB EMT SUSE$ .NLIST MEB .ENDM SUS$ SUS$ .PAGE ; UNS$ TASK UNSUSPEND MACRO .MACRO UNS$ TSKN,RTRN,CLER SPM$ TSKN MOV #RTRN,-(SP) EMT UNSE$ ERRM CLER .NLIST MEB .ENDM UNS$ UNS$ 5,RTNU,ERRU RTNU: NOP ERRU: NOP .PAGE ; EXT$ TASK EXIT MACRO .MACRO EX0 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, ; = 0 NO ERROR ; = 1 THE NUMERIC CHARACTERS WERE NOT RIGHT JUSTIFIED ; = -1 AN OVERFLOW OCCURED ; ; PROGRAMMER 54 REVISED 67 ; ;*******************1CMP #153,TEXBUF ;TEST FOR YES BEQ 3$ CMP #NO,TEXBUF ; NO BEQ DATTES ; DO NOT ENTER STATIC TEST BR 4$ 3$: BIS #BIT11,FLAG ;SET FLAG TO ENTER STATIC TEST DSKDR: EMT +1 CON3 JSR %7,NOCHA SUB #1,TEXBUF CMP #10,TEXBUF BLOS DSKDR MOV TEXBUF,DSKNOR ROL DSKNOR ROL DSKNOR ; DSKNOR CONTAINS NUMBER OF DISKS - 1 TIMES 4 BR ASKWC DATTES: EMT +1 CON4 ;ASK UNIT NUMBER JSR %7,NOCHA ;WAIT FOR NO. CMP #10,TEXBUF ;IS NO 2 %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 ;STACK POINTER PC = %7 ;PROGRAM COUNTER PS = 177776 ;PROCESSOR STATUS WORD ; ; M A G T A P E Q U A T E P A R A M E T E R S ; THREAD = 0. ;LIST THREAD DEVICE = 2. ;LOGICAL DEVICE TYPE TYPE = 3. ;EXIT TYPE $EXIT = 4. ;I/O COMPLETE ADDRESS DEVNUM = 6. 3T$ .LIST MEB EMT EXTE$ .NLIST MEB .ENDM EXT$ EXT$ .PAGE ; QTM$ QUEUE TIMER MACRO .MACRO QTM$ LIST,ERR,TMUL SPM$ LIST SPD$ TMUL EMT QTME$ ERRM ERR .NLIST MEB .ENDM QTM$ S3: QTM$ LS1,ER1,22 TG1: NOP ER1: NOP ER2: NOP .PAGE ; QTML$ TIMER LIST MACRO .MACRO QTML$ LIST,SOPT,RESL,ARGU,TSKN,MASK,FLAG,JSRA .LIST MEB TEMP$ = 0 .BOUND .IF NB LIST LIST: .WORD 1 ; THREAD WORD .WORD 0,0,0 ;RESERVED FOR SYSTEM STP$ SOPT,200 STP$ ARGU,100 S4**************************************************** .DEF ASCBIN .REF PUSHR,POPR ; SPACE=40 ZERO=60 PLUS = 53 MINUS=55 NINE=9. ; ASCBIN: TST -(SP) ; PUSH ONE 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 FOR RETURN AND 2 PARAM. PASS MOV #6,R0 ;SET 5= O>10 BLOS DATTES ;NO CLC ROL TEXBUF ROL TEXBUF ; PLACE DISK NUMBER IN FLAG BIS TEXBUF,FLAG ASKWC: EMT +1 CON5 ;ASK ABOUT OPTIONAL WORD COUNT JSR %7,ALPHA ;WAIT FOR ANSWER CMP #153,TEXBUF BEQ WCCON ; BR IF YES CMP #NO,TEXBUF ; TEST FOR NO BEQ OPDAR ; ASK ABOUT OPTIONAL DAR BR ASKWC ; ASK AGAIN WCCON: EMT +1 CON6 ;ASK LENGTH OF WC JSR PC,NOCHA BIC #3,TEXBUF 6 ;DEVICE NUMBER ERROR = 8. ;ERROR PARAMETER SYSTEM = 10. ;RESERVED (SAVE TASK NUMBER) DATA = 12. ;ADDRESS OF DATA BUFFER FUNCT = 18. ;FUNCTION CODE NWORD = 20. ;BUFFER SIZE IN WORDS COUNT = 22. ;SEE DEFINITION ABOVE STATUS = 24. ;HARDWARE STATUS REGISTER RES1 = 26. ;RESERVED 1 RES2 = 28. ;RESERVED 2 7TP$ FLAG,40 STP$ JSRA,20 STP$ TSKN,10 .BYTE RESL ; SET RESOLUTION .BYTE TEMP$ ; OPTION .WORD 0 ; RESERVED FOR SYSTEM .IF NB ARGU .WORD ARGU ; ARGUMENT TO BE TRANSMITTED TOTASK .ENDC .IF NB FLAG .WORD FLAG ; FLAG .WORD MASK ; MASK .WORD 0,0 ;RESERVED FOR SYSTEM .ENDC .IF NB JSRA .WORD JSRA ; ADDRESS OF SUBROUTINE TO BE EXECUTED .ENDC .IF NB TSKN .WORD TSKN ; NUMBER OF TASK TO BE QUEUED .ENDC .IFF # ; THE LIST SYMBOL MUST BE DEFINED .ENDC .NLIST MEBHPOSITION INDEX FOR LOOP CLR R5 ; CLEAR BINARY INTEGER ACCUM. CLR R2 ; CLEAR ERROR FLAG CLR -(SP) ; SET SIGN INDICATOR PLUS ATB010: MOVB (R1)+,R4 ; GET ASCII BYTE AND BUMP BEQ ATB020 ;IF BINARY ZERO-SUPPRESS CMPB #PLUS,R4 ; PLUS CHARACTER BEQ ATB090 CMPB #MINUS,R4 ; MINUS CHARACTER BEQ ATB080 CMPB #SPACE,R4 ;IF ASCII SE ; MAKE A MULTIPLE OF 4 TST TEXBUF BEQ WCCON CMP #1001,TEXBUF ;IS WORD COUNT>1000 BLOS WCCON ;YES ASK FOR COUNT AGAIN MOV TEXBUF,SWRDCT ;OPERATING WORD COUNT MOV SWRDCT,WRDCT ; OPTIONAL SECTOR ADDRESS **************** OPDAR: EMT +1 CON7 ;ASK ABOUT OPTIONAL DAR JSR %7,NOCHA CMP #100,TEXBUF ; 77 MAX SECTOR NUMBER BLOS OPDAR MOV TEXBUF, DMA ;TEMP DAR REGISTER OPPAT: EMT +1 CON8 ;ASK ABOUT DATA PATTERNS JSR %7,NOCHA CMP #23,TEXBUF ;TEST FOR CORRECT NO FRES3 = 30. ;RESERVED 3 ; MTDVLM = 1 ;HIGHEST LOGICAL DEVICE NUMBER (0 & 1) MTREP = 18. ;MAG TAPE REPEAT COUNT (4N+2) QTIME = 7 DQTIME = 10 ; MTWORD = 167540 ;WORD COUNT REGISTER MTSTAT = 167542 ;STATUS REGISTER MTCOMM = 167544 ;COMMAND REGISTER MTMEMO = 167546 ;MEMORY ADDRESS REGISTER ; ; COMMAND CODES FOR MAGNETIC TAPE CONTROLLER READ = G .ENDM QTML$ S1: QTML$ LS1,S,3,120,460,1243,45,TG1 .PAGE ; DQTM$ DEQUEUE TIMER MACRO .MACRO DQTM$ LIST,ERR SPM$ LIST EMT DQTE$ ERRM ERR .NLIST MEB .ENDM DQTM$ S4: DQTM$ LS1,ER1 .PAGE ; QSC$ QUEUE SCHEDULER MACRO ; QUEUE SCHEDULER MACRO .MACRO QSC$ LIST,ERR SPM$ LIST EMT QSKE$ ERRM ERR .NLIST MEB .ENDM QSC$ S5: QSC$ LS2,ER2 .PAGE ; QSCL$ SCHEDULER LIST MACRO ; THIS MACRO DOES NOT ALLOW THE (X) OPTION .MACRO QSCL$ LIST,SOP""""""" """"""""""""""""""""""""""""""""""""""""""""DDDDDDD@DDDDDDDDDDDDDDDDDDADD7B C.{ goQ8}{ 4fh!  U m #$Dfffffffff&"""""""""""""""""""""""""a ͋,L  B8w&B ` % & }&*C$$Βe E%>k  aʋaՀ$ & * P$ ΋Ί   ΋   d Ί  ( 1'u  Q$f $5@ U C΋ Cb M΋U@ U &  B" .&0 M &0 & M 0 &I BLOS OPPAT ;ASK AGAIN CMP #22,TEXBUF BEQ OPWRT ;DATA PATTERN UNDER PROGRAM CONTROL BIS #BIT15,FLAG ;SET PROGRAM FLAG MOV TEXBUF, PATNU ;OPERATOR WANTS TO SELECT DATA CLC ROL PATNU BIC #70000,FLAG ;CLEAR OP MODE BITS IN FLAG OPWRT: EMT +1 CON9 ;ASK ABOUT WRITE JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES BEQ $5 ; BR IF YES CMP #NO,TEXBUF ; TEST FOR NO BEQ OPWCK ; GO ASK ABOUT WRITE CHECK BR OPWRT J1 WRIT = 2 ;WRITE BUFFER WRFM = 4 ;WRITE FILE MARK WEXG = 10 ;WRITE WITH EXTENDED GAP SPCF = 20 ;SPACE FILE FORWARD BCKF = 40 ;BACK SPACE FILE SPCR = 100 ;SPACE RECORD FORWARD BCKR = 200 ;BACK SPACE RECORD REWD = 400 ;REWIND ENAB = 1000 ;ENABLE INTERRUPT OFFL = 2000 ;OFF LINE KT,DED,DEH,DEM,ARGE,TSKN,STD,STH,STM,MASK,FLAG .LIST MEB TEMP$ = 0 .BOUND .IF NB LIST LIST: .WORD 1 ; THREAD WORD .WORD 0,0,0 ;RESERVED FOR SYSTEM .BYTE 0 STP$ ARGE,200 STP$ FLAG,100 STP$ SOPT,40 .BYTE TEMP$ ; OPTION .WORD TSKN ; TASK NUMBER .WORD STD*40+STH*100+STM ; START .WORD DED*40+DEH*100+DEM ; DELTA .IF NB ARGE .WORD ARGE ; ARGUEMENT .ENDC .IF NB FLAG .WORD FLAG ; FLAG .WORD MASK .WORD 0,0 ;RESERVED FOR SYSTEM .ENDC .IFF # ; THE LIST SYMBOL LPACE-SUPPRESS BNE ATB105 ;SIGNIFICANT-START CALCULATION ATB020: DEC R0 ; FINISHED WITH STRING BNE ATB010 ;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. ; M ; ASK AGAIN $5: BIS #BIT14,FLAG ;YES SET FLAG BIT OPWCK: EMT +1 CON10 ;ASK ABOUT WRITE CHECK JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES ANSWER BEQ $6 ; BR IF YES CMP #NO,TEXBUF ; TEST FOR NO BEQ OPRD ; GO ASK ABOUT READ BR OPWCK ; ASK AGAIN $6: BIS #BIT13,FLAG ;YES SET FLAG BIT OPRD: EMT +1 CON11 ;ASK ABOUT READ JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES ANSWER BEQ NCLEA = 40000 ;CLEAR CONTROLLER ; ; FIRST AND LAST WORDS FOR LIST THREAD MTFRST: .WORD 0 MTLAST: .WORD MTFRST NMTREQ: .WORD -1 ; ; MAGNETIC TAPE FUNCTION JUMP TABLE MTFCT: .WORD MOPEN ;OPEN .WORD MCLOS ;CLOSE .WORD MREAD ;READ .WORD MWRIT ;WRITE .WORD MWEOF ;WRITE FILE MARK .WORD MREWI ;REWIND .WORD MSPRC ;SPACE +-N RECOMUST BE DEFINED .ENDC .NLIST MEB .ENDM QSCL$ S2: QSCL$ LS2,S,4,2,4,5,6,2,1,4,26,243 .PAGE ; DQSC$ DEQUEUE SCHEDULER MACRO .MACRO DQSC$ LIST,ERR SPM$ LIST EMT DQSE$ ERRM ERR .NLIST MEB .ENDM DQSC$ S6: DQSC$ LS2,ER2 .PAGE ; NCKP$ MACRO TO PROHIBIT CHECKPOINTING OF THE CALLING TASK .MACRO NCKP$ .LIST MEB EMT NCKE$ .NLIST MEB .ENDM NCKP$ NCKP$ .PAGE ; CKP$ MACRO TO ALLOW CHECKPOINTING OF THE CALLING TASK .MACRO CKP$ .LIST MEB P EACH DIGIT'S RESULT IS STORED BACK IN THE ; ACCUMULATOR TO USE FOR THE NEXT CALCULATION. ; ATB080: INC (SP) ; SET NEGATIVE FLAG ATB090: DEC R0 BEQ ATB110 ATB100: MOVB (R1)+,R4 ;GET NEXT ASCII BYTE AND 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 .IF NE,$1145 MUL #12,Q $7 ; BR IF YES CMP #NO,TEXBUF ; TEST FOR NO BEQ CHKFLG BR OPRD ; ASK AGAIN $7: BIS #BIT12,FLAG ;SET FLAG TO READ CHKFLG: BIT #70000,FLAG BEQ OPWRT ; GO BACK AND ASK AGAIN IF ALL NO ; ; ; ADTST: BIT #BIT11,FLAG ;ARE WE IN MULTI DISK MODE BEQ EXMFLG ;BRANCH IF NO. EMT +1 MES11 MOV FLAG,ACNVX ROR ACNVX ROR ACNVX MOV ACNVX,R0 ; SET UP DEVICE PAGE REGISTERS JSR RORDS .WORD MSKFI ;SKIP +-N FILES ; MAGNETIC TAPE RETURN AFTER INTERRUPT JUMP TABLE MTRET: .WORD MOPEN ;OPEN .WORD MCLOS ;CLOSE .WORD MRREA ;READ .WORD MRWRI ;WRITE .WORD MRWEO ;WRITE FILE MARK .WORD MRREW ;REWIND .WORD MSPRC ;SPACE +-N RECORDS .WORD MSKFI ;SKIP +-N FILES MTIMV: ; TIME OUT VALUES IN SECS EMT CKPE$ .NLIST MEB .ENDM CKP$ CKP$ .PAGE ; SGLD$ LOAD TASK SEGMENT .MACRO SGLD$ SGNM,CLER,ERES SPM$ SGNM SPD$ ERES EMT SGLE$ ERRM CLER .NLIST MEB .ENDM SGLD$ SGLD$ SG11,ERR2,ERR3 SG11: .ASCII /SEGNAM/ .PAGE ; MOVE N ARGUMENTS FROM THE CALLING TASKS ADDRESS SPACE INTO BUF .MACRO GETA CLER,BUF,NN SPM$ NN EMT GETE$ ERRM CLER .NLIST MEB .ENDM GETA GETA ERR2,BU,2 ERR2: NOP ERR3: NOP .PAGE ; MOVE N ARGUMENTS FROM THE BUF INTO THE CALLINGTR5 ; MULTIPLY BY 10 BCS ATB190 .IFF MOV R5,R3 ; ACCUM. TO SHIFT 2 ASL R3 ; MULTIPLY ASL R3 ; BY 4 ADD R3,R5 ; SAME AS N*5 ADD R5,R5 ; SAME AS N*10 BCS ATB190 .ENDC ADD R4,R5 ; COMBINE WITH BCD VALUE BCS ATB190 DEC R0 ;FINISHED WITH STRING? BNE ATB100 U PC,SETREG JSR %5,CONV ACNVX MES12 1 EMT +1 MES12 EXMFLG: BIT #BIT10,FLAG ;TEST FOR DATA TEST ONLY BEQ ADT2 ; DO COMPLETE TEST JMP DATAT ;DO DATA TEST ONLY TSTBF: .REPT 40 .WORD -1,-1 .ENDR ;***ADDRESS ADT2*** ; ;IN THIS TEST WRITE TRACK ZERO WITH ZERO'S ;THEN WRITE ALL ONES IN AN ADDRESS ;CHECK IF WRITING ONES IN THAT ADDRESS ALTERED ;ANY OTHER ADDRESS IN THE TRACK ;FOLLOW THIS PROCEDURE FOR ADDRESS (SECTORS) 1 TO 77 ;VONDS .BYTE 0,0 ;OPEN .BYTE 0,0 ;CLOSE .BYTE 5,0 ;READ .BYTE 5,0 ;WRITE .BYTE 5,0 ;WRITE FILE MARK .BYTE 180.,0 ;REWIND .BYTE 5,0 ;SPACE .BYTE 60.,0 ;SKIP MTTLI: ;MAGNETIC TAPE TIMER LIST .WORD 1 .BYTE 0 .BYTE 25 .WORD 0 .WORD MTTIM .PAGE ; ; W TASKS RECEIVING ADDRE .MACRO PUTA CLER,BUF,NN SPM$ NN SPD$ BUF EMT PUTE$ ERRM CLER .NLIST MEB .ENDM PUTA PUTA ERR2,BU,2 .PAGE .MACRO OICM$ IOCL,LUN,BLUN,ERES,NRES,NWD,BUF,EXT,TMD,FUNC,PRIR .BOUND .IF NB IOCL IOCL: .WORD 1 ; THREAD WORD .IFF ; # ; THE I/O CONTROL LIST SYMBOL MUST BE DEFINED .ENDC .WORD 0 ; CALLING TASK'S NUMBER .IF NB LUN .WORD LUN ; LOGICAL DEVICE NUMBER OR FILE NUMBER .IFF #; LOGICAL UNIT IS POSITIVE .ENDC .BYTE PRIR ; CALL PX ;NO ATB110: TST (SP)+ ; YES-STRING SIGN NEGATIVE BEQ ATB120 ; NO NEG R5 ; YES-NEGATE BINARY INTEGER ATB120: MOV R2,16.(SP) ; SET ERROR INDICATOR ATB130: MOV R5,14.(SP) ; SET BINARY INTEG. IN STACK JSR R5,POPR ; RESTORE REGISTERS RTS PC ; RETURN TO CALLER ; ATB190: TST -(R2) ; SET OVERFLOW FLAG ATB200: INC R2 BR ATB110 .END Y ; ADT2: MOV #1000,%6 ;SET UP STACK MOV #2000,@#SREQ ; SET LIGHTS MOV #4000,WRDCT ; SET UP WORD COUNT MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV PATNU,SAVE CLR PATNU CLR TRACK CLR DMA JSR %5,PASEL ;SET UP DATA BUFFER MOV SAVE,PATNU ; ZERO SECTORS 0 TO 37 RFADT: BIS #BIT8,@DCS WRITE 3$: TSTB @DCS ; TEST FOR READY BPL 3$ TST @DCS ;TEST FOR ERROR BPL RFADTY MOV #1,ERCOUNT ;ERROR OCCURRED MOV @DCS,WORKZ S T A R T O F M A G T A P ; MAGTAP: JSR R5,PUSHR ;SAVE R0-R5 ON STACK MOV 14.(SP),R0 ;R0 = F.W.A. OF LIST MOV #1,R4 ;SET ERROR CODE IN R4 DEC (R0) ;IS THREAD = 1 BNE MTERR ;IF NOT, RETURN MOV FUNCT(R0),RES2(R0) ; IS DEVICE TYPE = 4 INC R4 ;SET R4 = 2 CMPB DEVICE(R0),#4 BNE MTERR ;RETURN IF NOT 4 ; [RIORITY .BYTE EXT ; EXIT TYPE .WORD 0 ; CALL ERROR CODE .WORD NRES ; POINTER TO NORMAL RESUME LOCATION AFTER I/O .WORD ERES ; POINTER TO RESUME LOCATION AFTER I/O ERROR .BYTE TMD ; TRANSFER MODE .BYTE FUNC ; FUNCTION .WORD NWD ; NUMBER OF WORDS TO BE TRANSMITTED .WORD 0 ; ACTUAL NUMBER OF WORDS TRANSMITTED .WORD BUF ; POINTER TO I/O BUFFER .WORD 0 ; SYSTEM VIRTUAL ADDRESS OF I/O BUFFER .WORD 0 ; KPAR6 STORAGE .BYTE 0 ; ACCESS CONTROL .BYTE 0 ; AREA NUMBER .IF NB BL]1 ;FETCH DCS REGISTER MOV @DAR,WORK DEC WORK ER1: JSR %5,STAER1 ;REPORT ERROR OCURRED ;****WRD1=CONTROL STATUS REG. AT THE THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. AT THE TIME OF THE ERROR **** BR RFADT ;LOOP ON ERROR RFADTY: MOV #40,DMA ; ZERO SECTORS 40 TO 77 RFADTX: BIS #BIT8,@DCS ;CLEAR THE DISK WRITE $4: TSTB @DCS BPL $4 TST @DCS ;TEST FOR ERROR BPL RFRC MOV @DAR,WORK DEC WORK MOV @DCS,WORK1 ;FETCH DCS REGISTER MOV #2,^ IS EXIT TYPE 1 OR 2 INC R4 ;SET R4 = 3 MOVB TYPE(R0),R1 ;R1 = EXIT TYPE BLE MTERR ;BRANCH IF .LE. 0 CMP R1,#3 BGE MTERR ;BRANCH IF .GT. 3 ; IS THE LOGICAL DEVICE NUMBER 0 OR1 MOV #5,R4 MOVB DEVNUM(R0),R1 ;PLACE DEVICE NUMBER IN R1 BLT MTERR ;RETURN IF NEGATIVE CMP R1,#MTDVLM ;IS THE DEVICE NUMBER DEFINED BGT MTER_UN .WORD BLUN ; BACKUP LOGICAL DEVICE NUMBER OR FILE NUMBER .IFF #; BACKUP LOGICAL UNIT NUMBER MUST BE DEFINED AND BE A POSITIVE NUMBER .ENDC .ENDM OICM$ .PAGE .MACRO IOCL$ IOCL,LUN,BLUN,ERES,NRES,NWD,BUF,EXT,TMD,FUNC,PRIR .LIST MEB OICM$ IOCL,LUN,BLUN,ERES,NRES,NWD,BUF,EXT,TMD,FUNC,PRIR .NLIST MEB .ENDM IOCL$ AA: IOCL$ TD,3,4,EA,NA,10,BU,2 .PAGE ; I/O CONTROL LIST MACRO FOR ROS3.1 .MACRO IOCLF$ IOCL,LUN,BLUN,ERES,NRES,NWD,BUF,EXT,TMD,PRIR,REC .LIST MEB OIC`RES3 = 30. ;RESERVED 3 ; MTDVLM = 1 ;HIGHEST LOGICAL DEVICE NUMBER (0 & 1) MTREP = 18. ;MAG TAPE REPEAT COUNT (4N+2) QTIME = 7 DQTIME = 10 ; MTWORD = 167540 ;WORD COUNT REGISTER MTSTAT = 167542 ;STATUS REGISTER MTCOMM = 167544 ;COMMAND REGISTER MTMEMO = 167546 ;MEMORY ADDRESS REGISTER ; ; COMMAND CODES FOR MAGNETIC TAPE CONTROLLER READ = aERCOUNT ;SETUP ERROR COUNT ER2: JSR %5,STAER1 ;REPORT DISK ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. REG AT THE TIME OF THE ERROR **** BR RFADTX ;LOOP ON ERROR RFRC: CLR SAV1 RFRD: CLR SAVE WONWD: MOV #TSTBF,BUF MOV #100,WRDCT MOV SAV1,DMA BIS #BIT8,@DCS WRITE TSTB @DCS ;TEST FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL SUADB ;BRANCH IF NO CONTROL ERROR MOV @DCS,WORK1 MOV SAV1,WORK MOV #3,ERbR ;RETURN IF NOT ; IS THE FUNCTION CODE DEFINED MOV #10,R4 ;SET R4 = 8 MOV FUNCT(R0),R1 ;PLACE FUNCTION CODE IN R1 BLE MTERR ;BRANCH IF NEGATIVE CMP R1,R4 BGT MTERR ;BR IF R1 IS MORE THAN 8 CMP R1,#7 BLT MT01 ;BR IF R1 IS 6 OR LESS TST COUNT(R0) BEQ MTERR ;BR IF COUNT IS ZERO CLR NWORD(R0) MT01: CLcM$ IOCL,LUN,BLUN,ERES,NRES,NWD,BUF,EXT,TMD,0,PRIR .WORD REC ; LOGICAL RECORD NUMBER .WORD 0 ; CURRENT RECORD BLOCK NUMBER .WORD 0 ; CURRENT RECORD LENGTH .WORD 0 ; PREVIOUS RECORD BLOCK NUMBER .WORD 0 ; PREVIOUS RECORD LENGTH .WORD 0 ; NEXT RECORD BLOCK NUMBER .WORD 0 ; NEXT RECORD LENGTH .NLIST MEB .ENDM IOCLF$ IOCLF$ TA,3,4,EA,NA,10,BU,2,3,4,24 .PAGE ; OPEN CALL MACRO FOR ROS3.1 .MACRO OPN$ IOCL,CLER,ERES,NRES,ACCS .LIST MEB SLP$ NRES,IOCL,$NR SLP$ ERES,IOCL,$Ed1 WRIT = 2 ;WRITE BUFFER WRFM = 4 ;WRITE FILE MARK WEXG = 10 ;WRITE WITH EXTENDED GAP SPCF = 20 ;SPACE FILE FORWARD BCKF = 40 ;BACK SPACE FILE SPCR = 100 ;SPACE RECORD FORWARD BCKR = 200 ;BACK SPACE RECORD REWD = 400 ;REWIND ENAB = 1000 ;ENABLE INTERRUPT OFFL = 2000 ;OFF LINE eCOUNT ;SETUP ERROR COUNT ER3: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=DISK CONTROL STATUS AT THE TIME OF THE ERROR**** ;****WRD2=DISK ADDR. IN ERROR WHEN TRYING TO WRITE ALL ONES **** BR WONWD ;RE-WRITE WORD SUADB: MOV SAV1,R0 ; COMPUTE BUFFER ADDRESS OF -1 BLOCK ASH #7,R0 ADD #OUTBUF,R0 MOV R0,WORK4 ; SAVE FOR CLEAN UP MOV #100,R1 2$: MOV #-1,(R0)+ SOB R1,2$ WRCADT: BIS #BIT8,@DCS MOVfR SYSTEM(R0) ; PLACE LIST IN THREAD MOV @#PS,-(SP) ;INHIBIT INTERRUPTS, SAVE PROGRAM STATUS REG. SPL 7 ;SET PRIORITY TO 7 MOV R0,@MTLAST ;QUEUE IT MOV R0,MTLAST TST ACTIVE ;SEE IF CALLER IS A TASK BEQ MT04 ;BRANCH IF NOT MOV $CTASK,R2 INCB IOSTAT(R2) MOV R2,SYSTEM(R0) MT04: MOV (SP)+,@#PS MOV #MTREP,RES1(R0) ; gR SLP$ ACCS,IOCL,$ACC MOV #2,IOCL+$EX ; SET CALL TYPE TO SEQUENTIAL MOV #IOCL,-(SP) EMT OPNE$ ERPR IOCL,CLER .NLIST MEB .ENDM OPN$ START: OPN$ TA,CALER,EORS,NRRS,3 .PAGE ; CLOSE CALL MACRO FOR ROS3.1 .MACRO CLS$ IOCL,CLER,ERES,NRES .LIST MEB SLP$ NRES,IOCL,$NR SLP$ ERES,IOCL,$ER MOV #IOCL,-(SP) ; PLACE LIST ADDRESS ON STACK EMT CLSE$ ERPR IOCL,CLER .NLIST MEB .ENDM CLS$ AJ: CLS$ TA,CALER,EORS,NRRS .PAGE ; INPUT CALL MACRO FOR ROS3.1 hCLEA = 40000 ;CLEAR CONTROLLER ; ; FIRST AND LAST WORDS FOR LIST THREAD MTFRST: .WORD 0 MTLAST: .WORD MTFRST NMTREQ: .WORD -1 ; ; MAGNETIC TAPE FUNCTION JUMP TABLE MTFCT: .WORD MOPEN ;OPEN .WORD MCLOS ;CLOSE .WORD MREAD ;READ .WORD MWRIT ;WRITE .WORD MWEOF ;WRITE FILE MARK .WORD MREWI ;REWIND .WORD MSPRC ;SPACE +-N RECi #10000,WRDCT ; SET UP WORD COUNT MOV #OUTBUF,BUF ;SETUP CURRENT ADDR MOV SAVE,DMA ;SETUP DISK ADDRESS WRCHECK TSTB @DCS ;CHECK FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL CHKBUF ;BRANCH NO DISK ERROR MOV @DCS,WORK1 MOV SAV1,WORK DEC WORK MOV #4,ERCOUNT ;SET UP ERCOUNT ER4: JSR %5,STAER1 ;REPORT ERROR MOV @DAR,ACNVX ;SET UP DISK ADDR. FOR REPORT JSR %5,CONV ACNVX MES4 6 EMT +1 MES4 ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRjSET REPEAT COUNT AND CLEAR BACK SPACE INC NMTREQ ; BUMP NUMBER OF REQUESTS BNE MTEX2 ;BR IF NOT FIRST IN QUEUE MOV #CLEA,@#MTCOMM ;ISSUE CLEAR TO MAG TAPE CONTROLLER MOV FUNCT(R0),R1 ;RETURN JUMP TO DEC R1 ; DESIRED ASL R1 ; FUNCTIONAL JSR PC,@MTFCT(R1) ; ROUTINE CMP RES2(R0),#2 BLE MTXB2 TST R4 BEQ k .MACRO INP$ IOCL,CLER,LUN,BLUN,ERES,NRES,NWD,BUF,EXT,MOD,PRI,REC .LIST MEB SLP$ LUN,IOCL,$LUN SLP$ BLUN,IOCL,$BLU SLP$ ERES,IOCL,$ER SLP$ NRES,IOCL,$NR SLP$ NWD,IOCL,$NW SLP$ BUF,IOCL,$BUF SLH$ EXT,IOCL,$EX SLH$ MOD,IOCL,$MOD SLH$ PRI,IOCL,$PRI SLH$ REC,IOCL,$REC MOV #IOCL,-(SP) ; PLACE LIST ADDRESS ON STACK EMT INPE$ ERPR IOCL,CLER .NLIST MEB .ENDM INP$ AB: INP$ TA,CALER,4,5,EORS,NRRS,5,BU,2,1,3,5 .PAGE ; OUTPUT CALL MACRO FOR ROS3.1 .MACRO OUT$ lORDS .WORD MSKFI ;SKIP +-N FILES ; MAGNETIC TAPE RETURN AFTER INTERRUPT JUMP TABLE MTRET: .WORD MOPEN ;OPEN .WORD MCLOS ;CLOSE .WORD MRREA ;READ .WORD MRWRI ;WRITE .WORD MRWEO ;WRITE FILE MARK .WORD MRREW ;REWIND .WORD MSPRC ;SPACE +-N RECORDS .WORD MSKFI ;SKIP +-N FILES MTIMV: ; TIME OUT VALUES IN SECmD2=DISK ADDR. IN ERROR DURING WRITE CHECK **** ;****WRD ADDR.=ADDR. WHICH CONTAINS ALL ONES **** BR WRCADT ; CHKBUF: MOV WORK4,R0 ; CLEAR -1 BLOCK IN BUFFER MOV #100,R1 3$: CLR (R0)+ SOB R1,3$ ZEROAD: CLR SAVE ; MOV SAV1,DMA ;SETUP DISK ADDRESS MOV #OUTBUF,BUF MOV #100,WRDCT ; SET UP WORD COUNT WRITE TSTB @DCS ;CHECK FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL INDADT MOV #5,ERCOUNT MOV n MTEX1 ;BR IF NO ERRORS MTXB2: JSR PC,MTDEQ ; DEQUEUE REQUEST BR MTEXIT MTERR: INC (R0) MOV R4,ERROR(R0) ;STORE ERROR CODE IN LIST MTEXIT: MOV @#MTSTAT,STATUS(R0) JSR R5,POPR ;RESTORE REGISTERS MOV (SP)+,(SP) ;MOVE RETURN ADDRESS MTEX0: RTS PC ;RETURN TO CALLE- ; MTEX1: MOV #MTTLI,-(SP) ;ADDRESS OF MAG TAPE TIMER LIST oIOCL,CLER,LUN,BLUN,ERES,NRES,NWD,BUF,EXT,MOD,PRI,REC .LIST MEB SLP$ LUN,IOCL,$LUN SLP$ BLUN,IOCL,$BLU SLP$ ERES,IOCL,$ER SLP$ NRES,IOCL,$NR SLP$ NWD,IOCL,$NW SLP$ BUF,IOCL,$BUF SLH$ EXT,IOCL,$EX SLH$ MOD,IOCL,$MOD SLH$ PRI,IOCL,$PRI SLH$ REC,IOCL,$REC MOV #IOCL,-(SP) ; PLACE LIST ADDRESS ON STACK EMT OUTE$ ERPR IOCL,CLER .NLIST MEB .ENDM OUT$ AC: OUT$ TA,CALER,5,4,EORS,NRRS,5,BU,2,1,3,5 .PAGE ; I/O MACRO CALL .MACRO IOM$ IOCL,CLER,LUN,ERES,NRES,FpONDS .BYTE 0,0 ;OPEN .BYTE 0,0 ;CLOSE .BYTE 5,0 ;READ .BYTE 5,0 ;WRITE .BYTE 5,0 ;WRITE FILE MARK .BYTE 180.,0 ;REWIND .BYTE 5,0 ;SPACE .BYTE 60.,0 ;SKIP MTTLI: ;MAGNETIC TAPE TIMER LIST .WORD 1 .BYTE 0 .BYTE 25 .WORD 0 .WORD MTTIM .PAGE ; ; q@DCS,WORK1 MOV @DAR,WORK ER5: JSR %5,STAER1 ;****WRD1=CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. AT THE TIME OF THE ERROR **** BR ZEROAD ;LOOP ON ERROR INDADT: CMP #77,SAV1 BEQ LP2ADT ;LAST ADDR. CHECKED INC SAV1 JMP RFRD ;CHECK NEXT ADDRESS LP2ADT: BIT #BIT11,@SR ;IS BIT 11 SET IN SR BEQ ADT3 JMP ADT2 ;BIT 11 SET LOOP ON TEST .PAGE ;***** ADDRESS TEST ***** ; ;WRITE EACH UNIQUE ADDRESS ON ITSELF FOR TRACK 0 ;THEN READ IT BACKrMOV FUNCT(R0),R1 DEC R1 ASL R1 MOV MTIMV(R1),-(SP) ;VALUE OF DELAY MULTIPLE EMT QTIME TST (SP)+ ; THIS SECTION RETURNS TO THE CALLER IF EXIT TYPE 1 OR 3 ; AND TO THE ROS DISPATCHER IF EXIT TYPE 2,(SUSPENDER TASK FOR TYPE 2) MTEX2: CMPB #2,TYPE(R0) ;TYPE 2 ? BNE MTEXIT ;BR IF NOT TST SYSTEM(R0) ;SEE IF THIS IS A TASK CALLING BEQ MTEXIT ;BR IF TsCT .LIST MEB SLP$ LUN,IOCL,$LUN SLP$ ERESIOCL,$ER SLP$ NRESIOCL,$NR SLH$ FCTSIOCL,$FCT MOV #IOCL,-(SP) ; PLACE LIST ADDRESS ON STACK EMT IOE$ ERPR IOCL,CLER .NLIST MEB .ENDM IOM$ .PAGE .MACRO REW$ IOCL,CLER,LUN,ERES,NRES IOM$ IOCL,CLER,LUN,ERES,NRES,REWE$ .ENDM REW$ AD: REW$ TA,CALER,4,EORS,NRRS .PAGE ; FORWARD SPACE RECORD CALL MACRO .MACRO FSR$ IOCL,CLER,LUN,ERES,NRES IOM$ IOCL,CLER,LUN,ERES,NRES,FSRE$ .ENDM FSR$ AE: FSR$ TA,CALER,4,EORS,Nt S T A R T O F M A G T A P ; MAGTAP: JSR R5,PUSHR ;SAVE R0-R5 ON STACK MOV 14.(SP),R0 ;R0 = F.W.A. OF LIST MOV #1,R4 ;SET ERROR CODE IN R4 DEC (R0) ;IS THREAD = 1 BNE MTERR ;IF NOT, RETURN MOV FUNCT(R0),RES2(R0) ; IS DEVICE TYPE = 4 INC R4 ;SET R4 = 2 CMPB DEVICE(R0),#4 BNE MTERR ;RETURN IF NOT 4 ; u AND COMPARE FOR THE ;CORRECT DATA ; ; ADT3: CLR DMA ;CLEAR ACTIVE REG MOV #3000,@#SREQ ; SET LIGHTS MOV #0,TRACK ; USE MOV RATHER THAN 'CLR' FOR PATCHING IN TRAC CLR WORK CLR WORK1 MOV #1000,%6 ;SETUP STACK MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV #4000,WRDCT ; SET UP WORD COUNT MOV #OUTBUF,%0 ;FILL BUFFER WITH COUNT INADB: MOV WORK,(0)+ INC WORK ;+1 COUNT CMP #OUTBUF+10000,R0 BNE INADB ;SET UP NEXT WORD MOV WORvHE CALLER IS NOT A TASK MOV @#PS,14.(SP) ;PLACE PS ON STACK JSR R5,POPR ;RESTORE REGESTERS CLR -(SP) ;SET INVOLUNTARY SUSPEND FLAG JSR PC,QSAVEI ;AND LET QSAVI SUSPEND THE TASK JMP DSPTCH ; .PAGE ; M T I N T MAGNETIC TAPE INTERRUPT ROUTINE MTINT: $SAVE MOV R4,@#PS MOV MTFRST,R0 ;PLACE LIST ADDRESS IN R0 BEQ MTEYIT ;BR IF QUEUEwRRS .PAGE ; BACKSPACE RECORD CALL MACRO .MACRO BSR$ IOCL,CLER,LUN,ERES,NRES IOM$ IOCL,CLER,LUN,ERES,NRES,BSRE$ .ENDM BSR$ AF: BSR$ TA,CALER,4,EORS,NRRS .PAGE ; FORWARD SPACE FILE CALL MACRO .MACRO FSF$ IOCL,CLER,LUN,ERES,NRES IOM$ IOCL,CLER,LUN,ERES,NRES,FSFE$ .ENDM FSF$ AO: FSF$ TA,CALER,4,EORS,NRRS .PAGE ; BACK SPACE FILE CALL MACRO .MACRO BSF$ IOCL,CLER,LUN,ERES,NRES IOM$ IOCL,CLER,LUN,ERES,NRES,BSFE$ .ENDM BSF$ AG: BSF$ TA,CALER,4,EORS,NRRS .PAx IS EXIT TYPE 1 OR 2 INC R4 ;SET R4 = 3 MOVB TYPE(R0),R1 ;R1 = EXIT TYPE BLE MTERR ;BRANCH IF .LE. 0 CMP R1,#3 BGE MTERR ;BRANCH IF .GT. 3 ; IS THE LOGICAL DEVICE NUMBER 0 OR1 MOV #5,R4 MOVB DEVNUM(R0),R1 ;PLACE DEVICE NUMBER IN R1 BLT MTERR ;RETURN IF NEGATIVE CMP R1,#MTDVLM ;IS THE DEVICE NUMBER DEFINED BGT MTERyK,SAVE WRABF: BIS #BIT8,@DCS ;CLEAR THE DISK WORLD WRITE ;WRITE TSTB @DCS ;IS THE CONTROL READY BPL .-4 ;CONTROL READY TST @DCS ;IS THERE AN ERROR BPL TFBL ;NO ERROR MOV @DCS,WORK ;FETCH CONTENTS OF CONTROL REG MOV #6,ERCOUNT ;SET UP ERROR COUNT ER6: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR WRABF ;RE-WRITE DATA TFBL: MOV SAVE,WORK ADD #40,DMA CMP #10000,WORK BNE INADB-4 CLR WORK CLR Wz IS EMPTY MOV #MTTLI,-(SP) EMT DQTIME TST (SP)+ CLR R4 ; BRANCH ON FUNCTION CODE ON RETURNING FROM AN INTERRUPT MOV FUNCT(R0),R5 ;LOAD FUNCTION CODE (1 TO 8) DEC R5 ;(0 TO 7) ASL R5 JSR PC,@MTRET(R5) TST R5 BNE MTIN05 ;BRANCH IF I/O NOT COMPLETE MTINRE: JSR PC,MTDEQ ; DEQUEUE REQUEST CMPB TYPE(R0),#2 ;TYPE {GE ; WRITE END OF FILE CALL MACRO .MACRO EOF$ IOCL,CLER,LUN,ERES,NRES IOM$ IOCL,CLER,LUN,ERES,NRES,EOFE$ .ENDM EOF$ AH: EOF$ TA,CALER,4,EORS,NRRS NRRS: NOP ; NORMAL RESUME EORS: NOP ; ERROR RESUME CALER: NOP ; CALL ERROR THRE: .WORD 3 ERRWD: .WORD 240 ; ERROR WORD EA: .WORD 0 NA: .WORD 0 BU: .WORD 0,0,0 .PAGE ; CREATE FILE MACRO .MACRO CF$ LST,CLER SPM$ LST EMT Q$ ERPR LST,CLER .NLIST MEB .ENDM CF$ CF$ LST4,CLER4 .PAGE ; CREATE FILE|R ;RETURN IF NOT ; IS THE FUNCTION CODE DEFINED MOV #10,R4 ;SET R4 = 8 MOV FUNCT(R0),R1 ;PLACE FUNCTION CODE IN R1 BLE MTERR ;BRANCH IF NEGATIVE CMP R1,R4 BGT MTERR ;BR IF R1 IS MORE THAN 8 CMP R1,#7 BLT MT01 ;BR IF R1 IS 6 OR LESS TST COUNT(R0) BEQ MTERR ;BR IF COUNT IS ZERO CLR NWORD(R0) MT01: CL}ORK1 CLR DMA ADT3A: MOV #0,TRACK ; USE MOV RATHER THAN 'CLR' FOR PATCHING IN TRAC MOV #INBUF,BUF MOV #100,WRDCT RDTDN: BIS #BIT8,@DCS ;CLEAR THE DISK READ TSTB @DCS ;IS THE CONTROL READY BPL .-4 ;YES THE CONTROL IS READY TST @DCS ;IS THERE AN ERROR BPL ADRCMP ;NO ERROR MOV #7,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH CONTROL REG. ER7: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ER~2 EXIT BNE MTIN00 MOV SYSTEM(R0),-(SP) ;PLACE TASK NUMBER ON STACK CLR -(SP) ;PUSH 0 ON STACK JSR PC,UNSPND TST (SP)+ ;POP OFF ERROR CODE MTIN00: TST NMTREQ BMI MTEYIT ;BR IF -1 MOV MTFRST,R0 ;GET NEXT LIST ADDRESS JSR PC,MTINIT BPL MTINRE MOV FUNCT(R0),R1 ;RETURN JUMP TO DEC R1 ; DESIR LIST MACRO .MACRO CFL$ LIST,FNA,ERES,NRES,TYP,PROT,AREA,RSIZ,NREC .LIST MEB LIST: .WORD 1 ; THREAD WORD .WORD 0 ; RESERVED .RAD50 /FNA/ ; FILE NAME .BYTE 0 ; PRIORITY .BYTE 2 ; EXIT TYPE .WORD 0 ; ERROR WORD .WORD NRES ; NORMAL RESUME LOCATION .WORD ERES ; ERROR RESUME LOCATION .IF GT TYP .IF GT 5-TYP .BYTE TYP ; FILE TYPE (1 THRU 4) .IFF # ; THE FILE TYPE MUST BE 1 THRU 4 .ENDC .IFF # ; THE FILE TYPE MUST BE 1 THRU 4 .ENDC .IF GT PROT .IF GT 11-PROT R SYSTEM(R0) ; PLACE LIST IN THREAD MOV @#PS,-(SP) ;INHIBIT INTERRUPTS, SAVE PROGRAM STATUS REG. SPL 7 ;SET PRIORITY TO 7 MOV R0,@MTLAST ;QUEUE IT MOV R0,MTLAST TST ACTIVE ;SEE IF CALLER IS A TASK BEQ MT04 ;BRANCH IF NOT MOV $CTASK,R2 INCB IOSTAT(R2) MOV R2,SYSTEM(R0) MT04: MOV (SP)+,@#PS MOV #MTREP,RES1(R0) ; ROR **** BR RDTDN ;RE-READ ADRCMP: MOV #INBUF,R0 MOV DMA,R1 ASH #6,R1 MOV #100,R2 1$: CMP (R0)+,R1 BNE 2$ INC R1 SOB R2,1$ BR INCCMP 2$: MOV -(R0),WORK MOV R1,WORK1 MOV #10,ERCOUNT ;SET UP ERROR COUNT ER10: JSR %5,STAER1 ;REPORT COMPARISON ERROR ;****WRD1=DISK ADDR. WANTED **** ;****WRD2=DISK ADDR. RECEIVED **** INCCMP: INC DMA ; INC SECTOR NUMBER ED ASL R1 ; FUNCTIONAL JSR PC,@MTFCT(R1) ; ROUTINE CMP RES2(R0),#2 BLE MTINRE TST R4 BNE MTINRE MTIN05: MOV #MTTLI,-(SP) MOV FUNCT(R0),R1 DEC R1 ASL R1 MOV MTIMV(R1),-(SP) EMT QTIME TST (SP)+ MTEYIT: JMP RESTOR .PAGE ; MAGNETIC TAPE TIME OUT ROUTINE MTTIM: JSR R5,PUSHR.BYTE PROT ; PROTECTION CODE (1 THRU 8) .IFF # ; THE PROTECTION CODE MUST BE 1 THRU 8 .ENDC .IFF # ; THE PROTECTION CODE MUST BE 1 THRU 8 .ENDC .IF NB RSIZ .WORD RSIZ ; RECORD SIZE .IFF .IF EQ 4-TYP .WORD 0 ; RECORD SIZE .IFF # ; THE RECORD SIZE MUST BE INPUT FOR FILE TYPES 1 THRU 3 .ENDC .ENDC .WORD NREC ; NUMBER OF RECORDS TO BE ESTABLISHED .NLIST MEB .ENDM CFL$ CFL$ LST4,FIL4,ERE4,NRE4,2,3,1,64,4 CLER4: NOP ERE4: NOP NRE4: NOP .PAGE ; DELESET REPEAT COUNT AND CLEAR BACK SPACE INC NMTREQ ; BUMP NUMBER OF REQUESTS BNE MTEX2 ;BR IF NOT FIRST IN QUEUE MOV #CLEA,@#MTCOMM ;ISSUE CLEAR TO MAG TAPE CONTROLLER MOV FUNCT(R0),R1 ;RETURN JUMP TO DEC R1 ; DESIRED ASL R1 ; FUNCTIONAL JSR PC,@MTFCT(R1) ; ROUTINE CMP RES2(R0),#2 BLE MTXB2 TST R4 BEQ CMP #100,DMA ; LAST SECTOR BEQ LPADT3 BR RDTDN ;GO READ BUFFER LPADT3: BIT #BIT11,@SR ;LOOP ON TEST? BNE ADT3 ;YES BIT 11 SET IN SR .PAGE ;RF11 TRACK SELECTION TEST ; ;WRITE THE FIRST AND LAST ADDRESS OF EACH TRACK ;WITH THE OCTAL VALUE OF EACH TRACK ;BITS 6 THRU 11 EQUAL TRACK NUMBER ;BITS 0 THRU 5 EQUAL 0 IN FIRST SECTOR OF EACH TRACK ;BITS 0 THRU 5 EQUAL 77 IN LAST SECTOR OF EACH TRACK ; ;AFTER WRITING THE DISK READ EACH ADDRESS ;AND COMPARE DATA FOR MOV #CLEA,@#MTCOMM ;CLEAR CURRENT COMMAND MOV MTFRST,R0 BEQ MTTIM2 ; DEQUEUE THE REQUEST MOV #12,R4 JSR PC,MTDEQ ; DEQUEUE REQUEST CMPB TYPE(R0),#2 ;TYPE 2 EXIT BNE MTTIM2 MOV SYSTEM(R0),-(SP) ;PLACE TASK NUMBER ON STACK CLR -(SP) ;PUSH 0 ON STACK JSR PC,UNSPND TST (SP)+ ;POP OFF ERROR CODE MTTIM2: JSR R5,POPR TE FILE MACRO .MACRO DF$ LST,CLER SPM$ LST EMT Q$ ERPR LST,CLER .NLIST MEB .ENDM DF$ DF$ LST4,CLER4 .PAGE ; DISABLE SCHEDULER .MACRO MSK$ .LIST MEB EMT MSKE$ .NLIST MEB .ENDM MSK$ MSK$ .PAGE ; ENABLE SCHEDULER .MACRO UMSK$ .LIST MEB EMT UNME$ .NLIST MEB .ENDM UMSK$ UMSK$ .PAGE ; CONVERT FROM BINARY TO ASCII MACRO .MACRO BASC$ BVAL,ASCB .LIST MEB SPM$ BVAL SPD$ ASCB EMT BTAE$ .NLIST MEB .ENDM BASC$ BASC$ BINU MTEX1 ;BR IF NO ERRORS MTXB2: JSR PC,MTDEQ ; DEQUEUE REQUEST BR MTEXIT MTERR: INC (R0) MOV R4,ERROR(R0) ;STORE ERROR CODE IN LIST MTEXIT: MOV @#MTSTAT,STATUS(R0) JSR R5,POPR ;RESTORE REGISTERS MOV (SP)+,(SP) ;MOVE RETURN ADDRESS MTEX0: RTS PC ;RETURN TO CALLE- ; MTEX1: MOV #MTTLI,-(SP) ;ADDRESS OF MAG TAPE TIMER LIST THE CORRECT VALUE ; ADT4: CLR DMA ;CLEAR WORK REGISTERS MOV #4000,@#SREQ ; SET LIGHTS CLR TRACK JSR R5,ZOBUF ; ZERO OUTPUT BUFFER MOV #1000,%6 ;SETUP STACK BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #OUTBUF,BUF ;SET CURRENT ADDRESS MOV #4,WRDCT ; SET WORD COUNT INSWT: WRITE ;GO WRITE TSTB @DCS ;IS READY SET BPL .-4 ;YES! WAIT FOR NOT BUSY TST @DCS ;TEST FOR ERROR BPL TSTTK ;NO ERROR GO ON MOV #11,ERCOUNT ;SET UP ERROR COUNT ;RESTORE REGISTERS RTS PC ;RETURN TO CALLER .PAGE ; MAGNETIC TAPE OPEN ; MOPEN: JSR PC,MTINIT BR MCL10 ;GO TO COMMON EXIT FOR OPEN/CLOSE ; ; ; MAGNETIC TAPE CLOSE ; MCLOS: CLR R4 MCL10: RTS PC .PAGE ; M A G N E T I C T A P E R E A D ; R0 = ADDRESS OF LIST MREAD: ; INITIAL READ REQUEST JSR PC,MTINIT BPL MREA1 M,ASTBUF .PAGE ; CONVERT ASCII TO BINARY MACRO .MACRO ASCB$ ASCB,BVAL,ERES SPM$ ASCB EMT ATBE$ SRS$ BVAL ERRM ERES .NLIST MEB .ENDM ASCB$ ASCB$ ASTBUF,BINUM,ERPROC BINUM: .WORD 256 ASTBUF: .WORD 0,0,0 R50BUF: .WORD 0,0,0 ERPROC: NOP .PAGE ; CONVERT ASCII TO RAD50 .MACRO ASCR$ ASCB,RADB SPM$ ASCB SPD$ RADB EMT ASRE$ .NLIST MEB .ENDM ASCR$ ASCR$ ASTBUF,R50BUF .PAGE ; CONVERT RAD50 TO ASCII .MACRO RASC$ RADB,ASCB SPM$ ASCB SPD$ RADB MOV FUNCT(R0),R1 DEC R1 ASL R1 MOV MTIMV(R1),-(SP) ;VALUE OF DELAY MULTIPLE EMT QTIME TST (SP)+ ; THIS SECTION RETURNS TO THE CALLER IF EXIT TYPE 1 OR 3 ; AND TO THE ROS DISPATCHER IF EXIT TYPE 2,(SUSPENDER TASK FOR TYPE 2) MTEX2: CMPB #2,TYPE(R0) ;TYPE 2 ? BNE MTEXIT ;BR IF NOT TST SYSTEM(R0) ;SEE IF THIS IS A TASK CALLING BEQ MTEXIT ;BR IF T MOV @DCS,WORK ;REPORT CONTENTS OF DCS REG ER11: JSR %5,STAER ;REPORT ERROR OCCURRED ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR INSWT ;GO RE-WRITE TSTTK: CMP #7777,OUTBUF ; TEST FOR LAST ADDRESS BEQ INSRD ;GO READ THE DATA BIT #77,OUTBUF ; IS IT SECTOR NUMBER ZERO BNE MVNEM ;NO BIS #77,OUTBUF ; YES, SET UP FOR LAST SECTOR IN TRACK BIS #77,OUTBUF+2 BIS #77,OUTBUF+4 BIS #77,OUTBUF+6 MOV DATA(R0),@#MTMEMO MOV NWORD(R0),@#MTWORD ; FORM READ COMMAND IN R3 BIS #READ,R3 ;INCLUSIVE OR UNIT NUMBER AND COMMAND MOV R3,@#MTCOMM ;GIVE READ COMMAND MREA1: RTS PC ; ; THIS ROUTINE IS ENTERED AFTER A READ ATTEMPT OR A BACK SPACE RECORD ; ; R0 = ADDRESS OF LIST ; BYTE RES1 IS THE REREAD REPEAT COUNT ; BIT 15 OF RES1 IS THE BACK SPACE RECORD FLAG MRREA: CLR R5 EMT RACE$ .NLIST MEB .ENDM RASC$ RASC$ R50BUF,ASTBUF .PAGE ; GET DATE .MACRO DATE$ YADR,MADR,DADR .LIST MEB EMT GDAE$ SRS$ YADR SRS$ MADR SRS$ DADR .NLIST MEB .ENDM DATE$ DATE$ XBUF,YBUF,ZBUF XBUF: .WORD 0,0 YBUF: .WORD 0,0 ZBUF: .WORD 0,0 .PAGE ; GET TIME .MACRO TIME$ HADR,MADR,SADR .LIST MEB EMT GTIE$ SRS$ HADR SRS$ MADR SRS$ SADR .NLIST MEB .ENDM TIME$ TIME$ XBUF,YBUF,ZBUF .PAGE ; GET JULIAN DATE .MACRO JDATE$ JUL HE CALLER IS NOT A TASK MOV @#PS,14.(SP) ;PLACE PS ON STACK JSR R5,POPR ;RESTORE REGESTERS CLR -(SP) ;SET INVOLUNTARY SUSPEND FLAG JSR PC,QSAVEI ;AND LET QSAVI SUSPEND THE TASK JMP DSPTCH ; .PAGE ; M T I N T MAGNETIC TAPE INTERRUPT ROUTINE MTINT: $SAVE MOV R4,@#PS MOV MTFRST,R0 ;PLACE LIST ADDRESS IN R0 BEQ MTEYIT ;BR IF QUEUE ADD #77,DMA BR INSWT ;GO WRITE MVNEM: INC OUTBUF ;INC. TO NEXT TRACK INC OUTBUF+2 INC OUTBUF+4 INC OUTBUF+6 CLR DMA INC TRACK ;INC. DAE REG. BR INSWT ;GO WRITE ; ;READ THE FIRST AND LAST ADDRESS OF EACH TRACK ;AND VERIFY IT HAS THE CORRECT DATA INSRD: CLR DMA ;CLEAR WORK REG. CLR TRACK CLR SAVE BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #INBUF,BUF ;SET UP CURRENT ADDR MOV #4,WRDCT ; SET UP WORD C ;SET I/O COMPLETE MOV RES1(R0),R1 ;LOAD BACKSPACE FLAG AND REPEAT COUNT BPL MRRE1 ;CONTINUE IF NOT SET JSR PC,MREAD BR MRRE3 MRRE1: MOV @#MTSTAT,R2 BMI MRRE6 ASH #4,R2 ;MOVE ERROR BIT INTO SIGN BIT BMI MRRE2 ;BRANCH IF ERROR SET ; PLACE WORD COUNT AND STATUS IN LIST, RETURN MRRE6: MOV NWORD(R0),R2 ;BUFFER SIZE SUB @#MTWO .LIST MEB EMT GJDE$ SRS$ JUL .NLIST MEB .ENDM JDATE$ JDATE$ XBUF .END IS EMPTY MOV #MTTLI,-(SP) EMT DQTIME TST (SP)+ CLR R4 ; BRANCH ON FUNCTION CODE ON RETURNING FROM AN INTERRUPT MOV FUNCT(R0),R5 ;LOAD FUNCTION CODE (1 TO 8) DEC R5 ;(0 TO 7) ASL R5 JSR PC,@MTRET(R5) TST R5 BNE MTIN05 ;BRANCH IF I/O NOT COMPLETE MTINRE: JSR PC,MTDEQ ; DEQUEUE REQUEST CMPB TYPE(R0),#2 ;TYPE OUNT RDTKS: READ ;READ DATA TSTB @DCS ;CHECK FOR READY BPL .-4 ;CONTROL NOT READY TST @DCS ;IS THERE AN ERROR BPL CMPDTK ;NO ERROR MOV #12,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH CONTENTS OF DCS ER12: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR RDTKS ;GO RE-READ CMPDTK: CMP SAVE,INBUF ;IS DATA CORRECT BEQ CMNETK ;YES SETUP FOR NEXT WORD MOV SAVE,WORK1 ;CORRECT ADDRESS MOV INBUF,WORK ;INCORRECT DATA MOV RD,R2 ;MINUS WORD COUNT REGISTER MOV R2,COUNT(R0) ;SAVE IN LIST BR MRRE4 ; MRRE2: MOV #11,R4 DEC RES1(R0) ; DEC REPEAT COUNT BEQ MRRE4 JSR PC,MTINIT BPL MRRE4 MOVB #200,RES1+1(R0) ;SET BACK SPACE FLAG BIS #BCKR,R3 ;R3 =BACK SPACE COMMAND MOV R3,@#MTCOMM ;GIVE BACK SPACE COMMAND MRRE3: INC R5 ;SET I/O NOT COMPLETE MR#BIT15,SAVE ;SET UP FOR LAST ADDR ADD #3777,DMA ;SET UP FOR LAST WORD BR RDTKS ;GO READ LAST ADDR OF TK LPTSK: BIT #BIT11,@SR ;IS BIT 11 SET IN SR BEQ .+6 ;YES LOOP ON TEST JMP ADT4 ; ;RF11 LOOK AHEAD TEST ;WRITE ONE WORD UPON RECEIPT OF ;NOT READY READ THE LOOK AHEAD ;REGISTER IT SHOULD CONTAIN THE ;ADDRESS +1 ; ADT5: CLR DMA ;CLEAR REGISTERS CLR TRACK CLR SAVE MOV #1000,%6 ;SETUP STACK MOV #1,WRDCT ;SET UP FOR ONE WORD X-FER MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS WRADT52 EXIT BNE MTIN00 MOV SYSTEM(R0),-(SP) ;PLACE TASK NUMBER ON STACK CLR -(SP) ;PUSH 0 ON STACK JSR PC,UNSPND TST (SP)+ ;POP OFF ERROR CODE MTIN00: TST NMTREQ BMI MTEYIT ;BR IF -1 MOV MTFRST,R0 ;GET NEXT LIST ADDRESS JSR PC,MTINIT BPL MTINRE MOV FUNCT(R0),R1 ;RETURN JUMP TO DEC R1 ; DESIR#13,ERCOUNT ;SET UP ERROR COUNT ER13: JSR %5,STAER1 ;REPORT SELECTION ERROR ;****WRD1=TRACK ADDR. WANTED **** ;****WRD2=TRACK ADDR. RECEIVED **** CMNETK: CMP #7777,SAVE ; IS IT THE LAST ADDRESS BEQ LPTSK ;END OF TEST BIT #77,SAVE ; IS IT ADDRESS ZERO OF THE TRACK BEQ ZRBIT ;NO! SETUP FOR LAST ADDR INC SAVE ;INC FOR TRACK NO. CLR DMA ; SET UP DAR INC TRACK ;INC TRACK BR RDTKS ;GO READ ZRBIT: BIS #77,SAVE ; SET UP FOR LASRE4: RTS PC .PAGE ; M A G N E T I C T A P E W R I T E ; R0 = ADDRESS OF LIST ; BYTE RES1 IS REWRITE REPEAT COUNT ; BIT 15 OF RES1 IS BACK SPACE RECORD FLAG ; MWRIT: JSR PC,MTINIT BPL MWRI1 MOV #14,R4 ;SET ERROR CODE MOV @#MTSTAT,R2 ASR R2 ;PLACE BIT 0 IN CARRY BIT BCS MWRI1 ;BR IF NO WRITE RING CLR : MOV #177476,%0 BIS #BIT8,@DCS ;CLEAR THE DISK WRITE ;WRITE 1$: MOV (%0),@#WORK ;FETCH LOOK AHEAD TSTB @#177460 ;IS THE CONTROL BUSY BPL 1$ ;CONTROL STILL BUSY TST @DCS ;IS THERE AN ERROR BPL LPADT5 ;NO DISK ERRORS MOV #14,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH DCS FOR REPORT ER14: JSR %5,STAER ;REPROT CONTROL ERROR ;****WRD1=DISK CONTROL REG AT THE TIME OF THE ERROR **** BR WRADT5 ;LOOP ON ERROR LPADT5: MOV DMA,WORK1 ;IS LOOK AHEAD CORRECT CMP WORK1,WORK BEQ INCED ASL R1 ; FUNCTIONAL JSR PC,@MTFCT(R1) ; ROUTINE CMP RES2(R0),#2 BLE MTINRE TST R4 BNE MTINRE MTIN05: MOV #MTTLI,-(SP) MOV FUNCT(R0),R1 DEC R1 ASL R1 MOV MTIMV(R1),-(SP) EMT QTIME TST (SP)+ MTEYIT: JMP RESTOR .PAGE ; MAGNETIC TAPE TIME OUT ROUTINE MTTIM: JSR R5,PUSHRT SECTOR IN TRACK ADD #77,DMA BR RDTKS ;GO READ LAST ADDR OF TK LPTSK: BIT #BIT11,@SR ;IS BIT 11 SET IN SR BEQ ADT5 ; YES, LOOP ON TEST JMP ADT4 .PAGE ;RF11 LOOK AHEAD TEST ;WRITE ONE WORD UPON RECEIPT OF ;NOT READY READ THE LOOK AHEAD ;REGISTER IT SHOULD CONTAIN THE ;ADDRESS +1 ; ADT5: CLR DMA ;CLEAR REGISTERS MOV #5000,@#SREQ ; SET LIGHTS CLR TRACK CLR SAVE MOV #1000,%6 ;SETUP STACK MOV #4,WRDCT ; S R4 ;CLEAR ERROR FLAG MOV DATA(R0),@#MTMEMO MOV NWORD(R0),@#MTWORD ; IS THIS THE FOURTH TRY MOV RES1(R0),R2 ;LOAD REPEAT COUNT IN R2 BIC #177774,R2 BEQ MWRI2 ;BRANCH TO ISSUE WRITE WITH EXTENDED GAP ; ISSUE NORMAL WRITE BIS #WRIT,R3 ;OR IN WRITE COMMAND BR MWRI3 MWRI2: BIS #WEXG,R3 ;OR IN WRITE WITH EXTENDED GAP MWRI3: MOV R3,@#MTCOMM ADS ;LOOK AHEAD OK DEC WORK ;COMPARE FOR ADDRESS+1 CMP WORK1,WORK ; BEQ INCADS ;BRANCH IF EQUAL INC WORK MOV #15,ERCOUNT ER15: JSR %5,STAER1 ;REPORT LOOK AHEAD INCORRECT ;****WRD1=DISK ADDR. WANTED FROM LOOK AHEAD REG. **** ;****WRD2=DISK ADDR. RECEIVED FROM DISK LOOK AHEAD REG. **** BR WRADT5 ;LOOP ON ERROR INCADS: CMP #3777,DMA ;IS IT THE LAST ADDR. BEQ XLPADT5 ;LAST ADDRESS EXIT INC DMA ;+1 DMA BR WRADT5 ;CHECK NEXT ADDRESS XLPADT5:BIT #BIT11,@SR ;LOOP ON TEST BNE ADT5 MOV #CLEA,@#MTCOMM ;CLEAR CURRENT COMMAND MOV MTFRST,R0 BEQ MTTIM2 ; DEQUEUE THE REQUEST MOV #12,R4 JSR PC,MTDEQ ; DEQUEUE REQUEST CMPB TYPE(R0),#2 ;TYPE 2 EXIT BNE MTTIM2 MOV SYSTEM(R0),-(SP) ;PLACE TASK NUMBER ON STACK CLR -(SP) ;PUSH 0 ON STACK JSR PC,UNSPND TST (SP)+ ;POP OFF ERROR CODE MTTIM2: JSR R5,POPR ET UP FOR MINIMUM X-FER MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS WRADT5: MOV ADS,R0 ; PLACE ADDRESS OF LOOK AHEAD REG IN RO BIS #BIT8,@DCS ;CLEAR THE DISK WRITE ;WRITE 1$: TSTB @DCS ; IS THE CONTROLLER BUSY BPL 1$ ;CONTROL STILL BUSY MOV (%0),@#WORK ; FETCH LOOK AHEAD TST @DCS ;IS THERE AN ERROR BPL LPADT5 ;NO DISK ERRORS MOV #14,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH DCS FOR REPORT ER14: JSR %5,STAER ;REPROT CONTROL E;STORE IN COMMAND REGISTER MWRI1: RTS PC .PAGE ; THIS ROUTINE IS ENTERED BY THE INTERRUPT PROCESSOR AFTER WRITE COMMANDS ; MRWRI: CLR R5 ;SET I/O COMPLETE MOV RES1(R0),R1 BPL MRWR1 ;BRANCH IF THE BACK SPACE IS NOT SET JSR PC,MWRIT BR MRWR5 MRWR1: MOV @#MTSTAT,R2 ASH #4,R2 ;PALCE ERROR BIT IN SIGN BIT BMI MRWR2 ;BRANCH IF ERROR;YES LOOP ON TEST BIT 11 SET ; SPIRAL TESTS ; ;WRITE THE LAST WORD OF TRACK ZERO ;AND THE FIRST WORD OF TRACK ONE ;USING ONE WORD X-FERS ;DATE = 52525 SPIRAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PROCESSING MOV #1000,%6 ;SETUP STACK MOV #1,WRDCT ;SET WORD COUNT TO 1 CLR TRACK MOV #3777,DMA ;LAST WORD OF TRACK ZERO MOV #52525,OUTBUF ;SET UP DATA MOV #OUTBUF,BUF WRITE ;WRITE LAST ADDR TK ZERO TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;RESTORE REGISTERS RTS PC ;RETURN TO CALLER .PAGE ; MAGNETIC TAPE OPEN ; MOPEN: JSR PC,MTINIT BR MCL10 ;GO TO COMMON EXIT FOR OPEN/CLOSE ; ; ; MAGNETIC TAPE CLOSE ; MCLOS: CLR R4 MCL10: RTS PC .PAGE ; M A G N E T I C T A P E R E A D ; R0 = ADDRESS OF LIST MREAD: ; INITIAL READ REQUEST JSR PC,MTINIT BPL MREA1 RROR ;****WRD1=DISK CONTROL REG AT THE TIME OF THE ERROR **** BR WRADT5 ;LOOP ON ERROR LPADT5: MOV TRACK,R2 BIC #177000,R2 ASH #6,R2 MOV DMA,R1 ADD #2,R1 BIC #177700,R1 ADD R1,R2 CMP R2,WORK BEQ INCADS ;BRANCH IF EQUAL MOV R2,WORK1 MOV #15,ERCOUNT ER15: JSR %5,STAER1 ;REPORT LOOK AHEAD INCORRECT ;****WRD1=DISK ADDR. WANTED FROM LOOK AHEAD REG. **** ;****WRD2=DISK ADDR. REC ; PLACE WORD COUNT AND STATUS IN LIST MOV NWORD(R0),COUNT(R0) ;SAVE COUNT SUB @#MTWORD,COUNT(R0) MOV @#MTSTAT,STATUS(R0) ;SAVE STATUS BR MRWR3 ; ERROR ON LAST WRITE MRWR2: MOV #11,R4 DECB RES1(R0) ;DECREMENT REPEAT COUNT BEQ MRWR3 JSR PC,MTINIT ;INITIALIZE FOR BACK SPACE COMMAND BPL MRWR3 ;BRANCH NONE ZERO MOVB #200,RES1+1(R0) ;SET BACK BPL SPIL1 MOV #16,ERCOUNT MOV @DCS,WORK ER16: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL1: INC DMA WRITE ;WRITE FIRST ADDR. TK 1 TSTB @DCS ;WAIT FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL2 MOV #17,ERCOUNT MOV @DCS,WORK ER17: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL2: INC WRDCT ;SET UP FOR TWO WORD X-FER MOV #3777,DMA ;START AT ADDR 3777 MOV #INBUF,BUF ; MOV DATA(R0),@#MTMEMO MOV NWORD(R0),@#MTWORD ; FORM READ COMMAND IN R3 BIS #READ,R3 ;INCLUSIVE OR UNIT NUMBER AND COMMAND MOV R3,@#MTCOMM ;GIVE READ COMMAND MREA1: RTS PC ; ; THIS ROUTINE IS ENTERED AFTER A READ ATTEMPT OR A BACK SPACE RECORD ; ; R0 = ADDRESS OF LIST ; BYTE RES1 IS THE REREAD REPEAT COUNT ; BIT 15 OF RES1 IS THE BACK SPACE RECORD FLAG MRREA: CLR R5 EIVED FROM DISK LOOK AHEAD REG. **** BR WRADT5 ;LOOP ON ERROR INCADS: CMP #10000,R2 BLE XLPADT5 ; LAST ADDRESS EXIT INC DMA ;+1 DMA CMP #77,DMA BNE WRADT5 CLR DMA INC TRACK MOV TRACK,R1 ADD #5000,R1 MOV R1,@#SREQ BR WRADT5 ;CHECK NEXT ADDRESS XLPADT5:BIT #BIT11,@SR ;LOOP ON TEST BNE ADT5 ;YES LOOP ON TEST BIT 11 SET .PAGE ; SPIRAL TESTS ; ;WRITE THE LAST WORDSPACE FLAG BIS #BCKR,R3 ; MOV R3,@#MTCOMM ;GIVE COMMAND MRWR5: INC R5 ;SET I/O NOT COMPLETE MRWR3: RTS PC ; .PAGE ; M A G N E T I C T A P E W R I T E F I L E M A R K ; MWEOF: JSR PC,MTINIT BPL MWEOF1 MOV #14,R4 ;SET ERROR CODE MOV @#MTSTAT,R2 ASR R2 ;PLACE BIT 0 IN CARRY BIT BCS MWEOF1 READ ;READ DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL3 MOV #20,ERCOUNT MOV @DCS,WORK ER20: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL3: CMP #52525,INBUF ;CMP ADDR DAR 3777 BEQ CMPX1 ;COMPARE SECOND WORD MOV #21,ERCOUNT ;SETUP ERROR COUNT MOV INBUF,WORK ;INCORRECT DATA MOV #52525,WORK1 ;CORRECT DATA ER21: JSR %5,STAER1 ;REPORT ADDR 377 HAE BAD DATA ;****WRD1=THE DATA THAT SHOULD HAVE BEEN IN ;SET I/O COMPLETE MOV RES1(R0),R1 ;LOAD BACKSPACE FLAG AND REPEAT COUNT BPL MRRE1 ;CONTINUE IF NOT SET JSR PC,MREAD BR MRRE3 MRRE1: MOV @#MTSTAT,R2 BMI MRRE6 ASH #4,R2 ;MOVE ERROR BIT INTO SIGN BIT BMI MRRE2 ;BRANCH IF ERROR SET ; PLACE WORD COUNT AND STATUS IN LIST, RETURN MRRE6: MOV NWORD(R0),R2 ;BUFFER SIZE SUB @#MTWO OF TRACK ZERO ;AND THE FIRST WORD OF TRACK ONE ;USING ONE WORD X-FERS ;DATE = 52525 SPIRAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #6000,@#SREQ ; SET LIGHTS JSR R5,ZOBUF ; ZERO OUTPUT BUFFER JSR R5,ZBUF ; ZERO INPUT BUFFER MOV #340,@CSR ;LOCK UP PROCESSING MOV #1000,%6 ;SETUP STACK MOV #100,WRDCT ; SET WORD COUNT TO 100 CLR TRACK MOV #77,DMA ; LAST SECTOR OF TRACT ZERO MOV #100,R0 ;BR IF NO WRITE RING CLR R4 ;CLEAR ERROR FLAG BIS #WRFM,R3 ; COMMAND MOV R3,@#MTCOMM ;GIVE COMMAND MWEOF1: RTS PC ; ; THIS ROUTINE IS ENTERED BY THE INTERRUPT PROCESSOR AFTER WRITE E O F OPERATION ; MRWEO: CLR R5 ;SET I/O COMPLETE MOV RES1(R0),R1 BPL MRWEO1 ;BRANCH IF BACK SPACE FLAG IS NOT SET JSR PC,MWEOF BR MRWEO3 MRWEO1: ADDR. 3777**** ;****WRD2=THE DATA READ FROM ADDR. 3777**** BR SPIRAL ;LOOP ON ERROR CMPX1: CMP #52525,INBUF+2 ;COMPARE NEXT WORD BEQ LPSPI1 ;BRANCH IF DATA OK MOV #22,ERCOUNT ;SETUP ERROR COUNT MOV #52525,WORK1 ;CORRECT DATA MOV INBUF+2,WORK ;DATA READ FROM ADDR0 TK1 ER22: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR. 0 OF TRACK 1 **** ;****WDR2=THE DATA READ FROMADDR.0 OF TRACK 1 **** BR SPIRAL ;LOOP ON ERROR LPSPI1: BIT #BIT11,@SR ;LOOP ON TEST? BNE SPIRALRD,R2 ;MINUS WORD COUNT REGISTER MOV R2,COUNT(R0) ;SAVE IN LIST BR MRRE4 ; MRRE2: MOV #11,R4 DEC RES1(R0) ; DEC REPEAT COUNT BEQ MRRE4 JSR PC,MTINIT BPL MRRE4 MOVB #200,RES1+1(R0) ;SET BACK SPACE FLAG BIS #BCKR,R3 ;R3 =BACK SPACE COMMAND MOV R3,@#MTCOMM ;GIVE BACK SPACE COMMAND MRRE3: INC R5 ;SET I/O NOT COMPLETE MR ; SET UP DATA MOV #OUTBUF,R1 1$: MOV #52525,(R1)+ SOB R0,1$ MOV #OUTBUF,BUF WRITE ;WRITE LAST ADDR TK ZERO TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL1 MOV #16,ERCOUNT MOV @DCS,WORK ER16: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL1: CLR DMA INC TRACK WRITE ;WRITE FIRST ADDR. TK 1 TSTB @DCS ;WAIT FOR READY BPL .-4 ;CONTROL STILL BUSY TS MOV @#MTSTAT,R2 ASH #4,R2 ;PLACE ERROR BIT IN SIGN BIT BPL MRWEO2 MOV #11,R4 DECB RES1(R0) ;DECREMENT REPEAT COUNT BEQ MRWEO2 JSR PC,MTINIT ;INITIALIZE FOR BACK SPACE COMMAND BPL MRWEO2 MOVB #200,RES1+1(R0) ;SET BACK SPACE FLAG BIS #BCKR,R3 ; COMMAND MOV R3,@#MTCOMM ;GIVE COMMAND MRWEO3: INC R5 ;SETH "TXTLST" 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 INC R0 ; INC SECTOR NUMBER INC R1 ; INC SECTOR NUMBER CMP R0,TXTBK1+22 ; HAVE WE PASSED THE LAST SECTOR BLT RLD30 ; MORE SECTORS TO GO MOV R1,BFSIZE ; # OF SECTORS URE4: RTS PC .PAGE ; M A G N E T I C T A P E W R I T E ; R0 = ADDRESS OF LIST ; BYTE RES1 IS REWRITE REPEAT COUNT ; BIT 15 OF RES1 IS BACK SPACE RECORD FLAG ; MWRIT: JSR PC,MTINIT BPL MWRI1 MOV #14,R4 ;SET ERROR CODE MOV @#MTSTAT,R2 ASR R2 ;PLACE BIT 0 IN CARRY BIT BCS MWRI1 ;BR IF NO WRITE RING CLR T @DCS BPL SPIL2 MOV #17,ERCOUNT MOV @DCS,WORK ER17: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL2: MOV #200,WRDCT ; SET UP FOR 2 SECTOR X-FER DEC TRACK MOV #77,DMA MOV #INBUF,BUF ; READ ;READ DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL3 MOV #20,ERCOUNT MOV @DCS,WORK ER20: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR I/O NOT COMPLETE MRWEO2: RTS PC ; .PAGE ; M A G N E T I C T A P E R E W I N D ; MREWI: JSR PC,MTINIT BPL MREW1 BIT @#MTSTAT,#2 ;TEST LOAD POINT BIT BNE MREW2 BIS #REWD,R3 MOV R3,@#MTCOMM MREW1: RTS PC MREW2: CLR RES2(R0) BR MREW1 ; ; THIS ROUTINE IS ENTERED BY THE INTERRUPT PROCESSOR AFTER A REWIND ; MRREW: CLR SED UP IN LOAD MODULE ; NOW INITIALIZE ALL RELEVANT TASK AND PRIORITY TABLES JSR R5,REGPOP ; RESTORE TABLE POINTERS ASR R2 ; PRIORITY WAS SHIFTED ABOVE MOVB R2,TPRTY+$ROSM(R1) ; PRIORITY CLRB TSTAT+$ROSM(R1) ; TASK STATUS CLRB IOSTAT+$ROSM(R1); CLEAR IT'S I/O STATUS MOVB TXTBK1+22,BSIZE+$ROSM(R1) ; INIT # PAGES IN OVERLAY ASL R1 ; WORD INDEX MOV DFLIST+6,R0 ; R4 ;CLEAR ERROR FLAG MOV DATA(R0),@#MTMEMO MOV NWORD(R0),@#MTWORD ; IS THIS THE FOURTH TRY MOV RES1(R0),R2 ;LOAD REPEAT COUNT IN R2 BIC #177774,R2 BEQ MWRI2 ;BRANCH TO ISSUE WRITE WITH EXTENDED GAP ; ISSUE NORMAL WRITE BIS #WRIT,R3 ;OR IN WRITE COMMAND BR MWRI3 MWRI2: BIS #WEXG,R3 ;OR IN WRITE WITH EXTENDED GAP MWRI3: MOV R3,@#MTCOMM SPIRAL SPIL3: MOV #100,R0 ; CHECK INPUT FROM LAST SECTOR OF TRACK 0 MOV #INBUF,R1 1$: CMP #52525,(R1)+ BNE 2$ SOB R0,1$ BR CMPX1 2$: MOV #21,ERCOUNT ;SETUP ERROR COUNT MOV -(R1),WORK MOV #52525,WORK1 ;CORRECT DATA ER21: JSR %5,STAER1 ;REPORT ADDR 377 HAE BAD DATA ;****WRD1=THE DATA THAT SHOULD HAVE BEEN IN ADDR. 3777**** ;****WRD2=THE DATA READ FROM ADDR. 3777**** BR SPIRAL ;LOOP ON ERROR CMPX1: MOV R5 ;SET I/O COMPLETE RTS PC .PAGE ; MAGNETIC TAPE SPACE RECORD (+-N) ; MSPRC: CLR R5 ;SET I/O COMPLETE TST @#MTSTAT ;CHECK FOR FILE MARK BMI MSPRC5 JSR PC,MTINIT ;INITIALIZE BPL MSPRC2 TST COUNT(R0) BEQ MSPRC2 BMI MSPRC3 ;BR IF NEGATIVE ; DECREMENT (N) AND SPACE FORWARD DEC COUNT(R0) INC NWINIT FILE I.D. TSTB DFLIST+10 ; WAS AN IFD REQUESTED BPL RLD25 ;NO LEAVE AS FILE I.D. MOV DFLIST+4,R0 ;YES REPLACE WITH IFD FOR CORE DIRECTORY BIS #100000,R0 ; FLAG AS AN IFD RLD25: MOV R0,IFD+$ROSM(R1); PUT ONE IN THE TABLE CLR HEADER+$ROSM(R1); SHOW TASK READY TO RUN ASR R1 ; RETURN TO BYTE INDEX CMP R1,@#TASKS+$ROSM; TASKS = MAX(TASKS,TASKNO) BLE RLD26 ;STORE IN COMMAND REGISTER MWRI1: RTS PC .PAGE ; THIS ROUTINE IS ENTERED BY THE INTERRUPT PROCESSOR AFTER WRITE COMMANDS ; MRWRI: CLR R5 ;SET I/O COMPLETE MOV RES1(R0),R1 BPL MRWR1 ;BRANCH IF THE BACK SPACE IS NOT SET JSR PC,MWRIT BR MRWR5 MRWR1: MOV @#MTSTAT,R2 ASH #4,R2 ;PALCE ERROR BIT IN SIGN BIT BMI MRWR2 ;BRANCH IF ERROR #100,R0 1$: CMP #52525,(R1)+ BNE 2$ SOB R0,1$ BR LPSPI1 2$: MOV #22,ERCOUNT ;SETUP ERROR COUNT MOV #52525,WORK1 ;CORRECT DATA MOV -(R1),WORK ER22: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR. 0 OF TRACK 1 **** ;****WDR2=THE DATA READ FROMADDR.0 OF TRACK 1 **** SPIL5: JMP SPIRAL LPSPI1: BIT #BIT11,@SR ;LOOP ON TEST? BNE SPIL5 .PAGE ; SPIRAL TEST EXT. ; ;WRITE TWO WORDS OFORD(R0) BIS #SPCR,R3 ; BR MSPRC4 ; INCREMENT (N) AND SPACE BACK MSPRC3: INC COUNT(R0) DEC NWORD(R0) BIS #BCKR,R3 MSPRC4: MOV R3,@#MTCOMM ;GIVE COMMAND INC R5 ;SET I/O NOT COMPLETE MSPRC2: RTS PC MSPRC5: TST NWORD(R0) BGT MSPRC6 INC NWORD(R0) DEC COUNT(R0) BR MSPRC2 MSPRC6: DEC NW MOV R1,@#TASKS+$ROSM RLD26: MOV #$TKFLS+$ROSM,-(SP) ; MUST WRITE OUT CURRENT VERSION EMT SDRITE JMP RLKGA ; GO ENTER NEXT TASK ; RLKER1: JMP RLKER ; ERROR EXIT .PAGE ; PROCESS FILE IDENTIFICATION NUMBER RLFID: TST R3 ; EQUAL SIGN DELIMITER BEQ RLFI2 RLFI1: MOV #105,R3 ; SET ERROR CODE BR RTIM6 ; ERROR EXIT RLFI2: JSR PC,GWORD CMP ; PLACE WORD COUNT AND STATUS IN LIST MOV NWORD(R0),COUNT(R0) ;SAVE COUNT SUB @#MTWORD,COUNT(R0) MOV @#MTSTAT,STATUS(R0) ;SAVE STATUS BR MRWR3 ; ERROR ON LAST WRITE MRWR2: MOV #11,R4 DECB RES1(R0) ;DECREMENT REPEAT COUNT BEQ MRWR3 JSR PC,MTINIT ;INITIALIZE FOR BACK SPACE COMMAND BPL MRWR3 ;BRANCH NONE ZERO MOVB #200,RES1+1(R0) ;SET BACK DATA ;STARTING WITH THE LAST ADDRESS OF TRACK0 ;DATA PATTERN = 25252 ;THEN READ THE DATA DOING ONE WORD ;X-FERS XSPIRL: BIS #BIT8,@DCS ; CLEAR MOV #7000,@#SREQ ; SET LIGHTS JSR R5,ZBUF ; ZERO INPUT BUFFER JSR R5,ZOBUF ; ZERO OUTPUT BUFFER MOV #340,@CSR ;LOCK UP PROCESSING MOV #1000,%6 ;SET UP STACK MOV #200,R0 ; SET UP TWO SECTORS MOV #OUTBUF,R1 1$: MOV #25252,(R1)+ SOB R0,ORD(R0) INC COUNT(R0) BR MSPRC2 .PAGE ; MAGNETIC TAPE SKIP FILES (+-N) ; MSKFI: CLR R5 ;SET I/O COMPLETE MOV @#MTSTAT,R1 ASL R1 BMI MSKFI5 JSR PC,MTINIT ;INITIALIZE BPL MSKFI2 TST COUNT(R0) BEQ MSKFI2 BMI MSKFI3 ;BR IF NEGATIVE DEC COUNT(R0) INC NWORD(R0) BIS #SPCF,R3 #1,R3 ; TEST FOR SEMI-COLON DELIMITER BNE RLFI1 MOV #FWASC,-(SP) EMT ASCBIN MOV (SP)+,FILID ; SAVE FILE IDENTIFICATION NUMBER TST (SP)+ ; CLEAR STACK JMP RLKGC ; GO PROCESS NEXT COMMAND .PAGE ; PROCESS NAME COMMAND RLNAM: TST R3 ; EQUAL SIGN DELIMITER BNE RLNAM1 ; NO BRANCH JSR PC,GWORD ; GET NAME OF BFUP FILSPACE FLAG BIS #BCKR,R3 ; MOV R3,@#MTCOMM ;GIVE COMMAND MRWR5: INC R5 ;SET I/O NOT COMPLETE MRWR3: RTS PC ; .PAGE ; M A G N E T I C T A P E W R I T E F I L E M A R K ; MWEOF: JSR PC,MTINIT BPL MWEOF1 MOV #14,R4 ;SET ERROR CODE MOV @#MTSTAT,R2 ASR R2 ;PLACE BIT 0 IN CARRY BIT BCS MWEOF1 1$ MOV #200,WRDCT ; SET WORD COUNT FOR 2 SECTORS MOV #OUTBUF,BUF ;SET UP CMA CLR TRACK ;SET UP DISK ADDR. MOV #77,DMA WRITE ;WRITE DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X1SPIL ;BRANCH IF NO ERROR MOV @DCS,WORK MOV #23,ERCOUNT ;SET UP ERROR COUNT ER23: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR XSPIRL X1SPIL: MOV ;FORM SKIP FILE COMMAND BR MSKFI4 MSKFI3: INC COUNT(R0) ;INCREMENT COUNT DEC NWORD(R0) BIS #BCKF,R3 ;FORM BACK SPACE FILE COMMAND MSKFI4: MOV R3,@#MTCOMM ;GIVE COMMAND INC R5 ;SET I/O NOT COMPLETE MSKFI2: RTS PC MSKFI5: TST NWORD(R0) BGT MSKFI6 INC NWORD(R0) DEC COUNT(R0) BR MSKFI2 MSKFI6: E CMP #1,R3 ; SEMI-COLON DELIMITER BEQ RLNAM2 ; YES BRANCH RLNAM1: MOV #64,R3 ; SET ERROR CODE JMP RLKER ; ERROR EXIT RLNAM2: MOV #FWASC,-(SP) ; ASCII BUFFER ADDRESS MOV #FWRAD,-(SP) ; RAD50 BUFFER ADDRESS EMT R50PAK MOV FWRAD,BFNAM ; SAVE NAME MOV FWRAD+2,BFNAM+2 JMP RLKGC ; GO PROCESS NEXT COMMAND .PAGE ; PROCESS PRI ;BR IF NO WRITE RING CLR R4 ;CLEAR ERROR FLAG BIS #WRFM,R3 ; COMMAND MOV R3,@#MTCOMM ;GIVE COMMAND MWEOF1: RTS PC ; ; THIS ROUTINE IS ENTERED BY THE INTERRUPT PROCESSOR AFTER WRITE E O F OPERATION ; MRWEO: CLR R5 ;SET I/O COMPLETE MOV RES1(R0),R1 BPL MRWEO1 ;BRANCH IF BACK SPACE FLAG IS NOT SET JSR PC,MWEOF BR MRWEO3 MRWEO1: #100,WRDCT ; SET UP FOR 100 WORD X-FER CLR TRACK MOV #77,DMA ; SET UP DAR MOV #INBUF,BUF ;SET UP CMA READ ;READ DAR 3777 TSTB @DCS ;TEST FOR NOT READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X2SPIL ;BRANCH IF NO ERROR MOV #24,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTROL REG ER24: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE THE ERROR **** BR XSPIRL X2SPIL: MOV DEC NWORD(R0) INC COUNT(R0) BR MSKFI2 .PAGE ; THIS IS A MAGNETIC TAPE CONTROLLER INITIALIZATION ROUTINE ; CALL IS JSR PC,MTINIT ; RETURNS WITH ; R3 = DEVICE NUMBER SHIFTED FOR A COMMAND INSTRUCTION ; R4 = 0 AND (N) BIT SET IF NO ERROR ; R4 = 1 AND (N) BIT CLEAR IF TIME OUT ERROR ; MTINIT: MOV #CLEA,@#MTCOMM ;ISSUE CLEAR TO MAG TAPE CONTROLLER MOVB DEVNUM(R0),R3 ;OBTAIN DEVICE NUMBER ORITY RLPRI: TST R3 ; EQUAL SIGN BEQ RLPR2 RLPR1: MOV #65,R3 ; SET ERROR CODE BR RTIM6 RLPR2: JSR PC,GWORD CMP #1,R3 ; TEST FOR SEMI-COLON BNE RLPR1 MOV #FWASC,-(SP) EMT ASCBIN MOV (SP)+,R2 ; R2 = BINARY NUMBER TST (SP)+ ; CLEAR STACK TST R2 BLT RLPR1 ; BRANCH IF NEGATIVE CMP R2,#NP MOV @#MTSTAT,R2 ASH #4,R2 ;PLACE ERROR BIT IN SIGN BIT BPL MRWEO2 MOV #11,R4 DECB RES1(R0) ;DECREMENT REPEAT COUNT BEQ MRWEO2 JSR PC,MTINIT ;INITIALIZE FOR BACK SPACE COMMAND BPL MRWEO2 MOVB #200,RES1+1(R0) ;SET BACK SPACE FLAG BIS #BCKR,R3 ; COMMAND MOV R3,@#MTCOMM ;GIVE COMMAND MRWEO3: INC R5 ;SET #100,R0 ; CHECK INPUT FROM LAST SECTOR OF TRACK 0 MOV #INBUF,R1 1$: CMP #25252,(R1)+ BNE 2$ SOB R0,1$ BR X3SPIL 2$: MOV #25,ERCOUNT ;SET UP ERROR COUNT MOV #25252,WORK1 ;GOOD DATA MOV -(R1),WORK ER25: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR.3777 OF TRACK 0 **** ;****WRD2=THE DATA THAT WAS READ FROM ADDR. 3777 OF TRACK 0 **** BR XSPIRL X3SPIL: MOV #1,TRACK ASH #12.,R3 ;LEST SHIFT 0&1 INTO 12&13 MOV R3,@#MTCOMM ;STORE UNIT NUMBER IN COMMAND REGISTER BIS #1000,R3 ;SET INTERRUPT ENABLE BIT ; CLEAR BACK SPACE FLAG AND SET DELAY COUNTER TO ZERO CLRB RES1+1(R0) ;CLEAR BACK SPACE FLAG CLR R4 ; TEST READY BIT CMP FUNCT(R0),#1 ;OPEN COMMAND BEQ MTIN3 MOVB @#MTSTAT,R1 ;LOAD WITH BYTE SIGN EXTENDED BGT MTIN2 ;BRIOR BGT RLPR1 ; BR IF TOO HIGH MOVB R2,HPRIR ; SAVE PRIORITY JMP RLKGC ; GO TO PROCESS NEXT COMMAND .PAGE ; PROCESS A SYSTEM TASK RLSYS: TST R3 ; EQUAL SIGN DELIMITER BNE RLSY1 ;NO, BRANCH JSR PC,GWORD ; GET TASK NAME CMP R3,#1 ; SEMI-COLON DELIMITER BEQ RLSY2 RLSY1: MOV #106,R3 ; LOAD ERROR CODE I/O NOT COMPLETE MRWEO2: RTS PC ; .PAGE ; M A G N E T I C T A P E R E W I N D ; MREWI: JSR PC,MTINIT BPL MREW1 BIT @#MTSTAT,#2 ;TEST LOAD POINT BIT BNE MREW2 BIS #REWD,R3 MOV R3,@#MTCOMM MREW1: RTS PC MREW2: CLR RES2(R0) BR MREW1 ; ; THIS ROUTINE IS ENTERED BY THE INTERRUPT PROCESSOR AFTER A REWIND ; MRREW: CLR JSR R5,ZBUF ; ZERO INPUT BUFFER MOV #100,WRDCT MOV #INBUF,BUF CLR DMA READ ;READ DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X4SPIL ;BRANCH IF NO ERROR MOV #26,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTROL REG. ER26: JSR %5,STAER ;REPORT ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR XSPIRL .BLKW 40 ; PATCH RANCH IF BIT 7 WAS 0 MTIN3: RTS PC ;RETURN MTIN2: MOV #11,R4 BR MTIN3 ; ; ; DEQUEUE THE REQUEST MTDEQ: MOV R4,ERROR(R0) DEC NMTREQ MOV @#MTSTAT,STATUS(R0) MOV @#PS,-(SP) ;SAVE CURRENT CPU STATUS REGISTER SPL 7 ;INHIBIT INTERRUPTS MOV (R0),MTFRST ;PUT NEXT GUY IN THRAED AT TOP OF QUEUE BNE MTDEQ2 MOV #MTFRST,MTLASTBR RLKER ; ERROR EXIT MOV #FWASC,-(SP) MOV #FWRAD,-(SP) EMT R50PAK ; ASCII TO RAD50 CONVERSION MOV #FWRAD,R4 ; ADDRESS OF TASK NAME MOV #SYSTBL,R5 ; FWA OF TABLE RLSY2: CMP (R4),(R5) ; COMPARE FIRST 3 CHAR BEQ RLSY4 ; BR IF SAME RLSY3: ADD #12,R5 ; ADDRESS OF NEXT ENTRY TST (R5) ; END OF TABLE BEQ RLSY1 ;YES, R5 ;SET I/O COMPLETE RTS PC .PAGE ; MAGNETIC TAPE SPACE RECORD (+-N) ; MSPRC: CLR R5 ;SET I/O COMPLETE TST @#MTSTAT ;CHECK FOR FILE MARK BMI MSPRC5 JSR PC,MTINIT ;INITIALIZE BPL MSPRC2 TST COUNT(R0) BEQ MSPRC2 BMI MSPRC3 ;BR IF NEGATIVE ; DECREMENT (N) AND SPACE FORWARD DEC COUNT(R0) INC NWAREA X4SPIL: MOV #100,R0 MOV #INBUF,R1 1$: CMP #25252,(R1)+ BNE 2$ SOB R0,1$ BR LPXSPIL ; BR IF ALL DATA OK 2$: MOV #27,ERCOUNT ;SET UP ERROR COUNT MOV #25252,WORK1 ;GOOD DATA MOV -(R1),WORK ER27: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR. 0 OF TRACK 1 **** ;****WRD2=THE DATA THAT WAS READ FROM ADDR. 0 OF TRACK 1 **** X5SPIL: JMP XSPIRL LPXSPIL:BIT #BIT11,@SR ;LO MTDEQ2: MOV #1,(R0) ;SET LIST READY MOV (SP)+,@#PS ;UN-INHIBIT THE INTERRUPTS MOV SYSTEM(R0),R2 ;GET TASK NUMBER OF REQUESTOR BEQ MTDEQ1 ;BRANCH IF NOT A TASK DECB IOSTAT(R2) ;OTHERWISE, DECREMENT THE I/O IN PROGRES BNE MTDEQ1 MOV R2,-(SP) ;GO TO OVERLAY MONITOR SO THE TASKS CORE JSR PC,RELTSK ; CAN BE RELEASED MTDEQ1: RTS PC .END TAKE ERROR EXIT BR RLSY2 RLSY4: CMP 1(R4),1(R5) ; COMPARE CHARACTERS 4 TO 6 BNE RLSY3 ; GO TEST NEXT ENTRY MOV (R5)+,BFNAM ; SET UP TASK MOV (R5)+,BFNAM+2 ; NAME MOV (R5)+,TSKNO ; TASK # MOV (R5)+,FILID ; FILE # MOVB (R5)+,FILTY ; FILE TYPE MOVB (R5)+,HPRIR ; PRIORITY MOV #20,TSKAC ; MAKE A SYSTEM TASK CLR MAXTM ; ORD(R0) BIS #SPCR,R3 ; BR MSPRC4 ; INCREMENT (N) AND SPACE BACK MSPRC3: INC COUNT(R0) DEC NWORD(R0) BIS #BCKR,R3 MSPRC4: MOV R3,@#MTCOMM ;GIVE COMMAND INC R5 ;SET I/O NOT COMPLETE MSPRC2: RTS PC MSPRC5: TST NWORD(R0) BGT MSPRC6 INC NWORD(R0) DEC COUNT(R0) BR MSPRC2 MSPRC6: DEC NWOP ON TEST? BNE X5SPIL .PAGE CLRREG: CLR DMA ;CLEAR WORD ADDRESS CLR TRACK ;CLEAR TRACK ADDRESS ; ; DATAT: MOV SWRDCT,WRDCT MOV #LDAT,HRDER ;SETUP FOR HARD ERROR MOV #340,@CSR ;LOCK UP PROCESSOR PRIORITY JSR %5,PASEL ;SET UP DATA BUFFERS LDAT: JSR %5,OPDSEL ;SET UP DISK ADDRESS MOV TRACK,@#SREQ BIT #BIT14,FLAG ;TEST FOR WRITE BEQ SLH ;TEST FOR WRITE CHECK MOV #OUTBUF,BUF ;SETUP OUTPUT BUFFER WRITE +100 ;WRITE WITH INT. ENABLED BIT #BIT9,@SR ;FCLR MAXIMUM TIME INC DEVPG ; SET DEVICE PAGE FLAG JMP RLKGC ; GO PROCESS NEXT COMMAND .PAGE ; PROCESS TIME LIMIT COMMAND RLTIM: TST R3 BNE RTIM1 JSR PC,GWORD CMP #1,R3 ; SEMI-COLON DELIMITER ? BEQ RTIM2 ;YES, CONTINUE RTIM1: MOV #66,R3 ; SET ERROR CODE BR RTIM6 RTIM2: MOV #FWASC,-(SP) ; ASCII STRING ADDRESS EMT ORD(R0) INC COUNT(R0) BR MSPRC2 .PAGE ; MAGNETIC TAPE SKIP FILES (+-N) ; MSKFI: CLR R5 ;SET I/O COMPLETE MOV @#MTSTAT,R1 ASL R1 BMI MSKFI5 JSR PC,MTINIT ;INITIALIZE BPL MSKFI2 TST COUNT(R0) BEQ MSKFI2 BMI MSKFI3 ;BR IF NEGATIVE DEC COUNT(R0) INC NWORD(R0) BIS #SPCF,R3 IND OUT HOW TO WAIT FOR INT BNE WRWAIT ;WAIT WITH WAIT INSTRUCTION IOT ;WAIT IN BACKGROUND TEST BR SLH WRWAIT: MOV PRIORITY,@CSR WAIT ;WAIT FOR FLAG SLH: BIT #BIT13,FLAG ;TEST FOR WRITE CHECK BEQ ESH ;TEST FOR READ MOV #OUTBUF,BUF ;SETUP OUTPUT BUFFER MOV #340,@CSR WRCHECK +100 ;WRITE CHECK WITH INT. ENABLE BIT #BIT9,@SR ;FINDOUT HOW TO WAIT FOR INT. BNE WCWAIT ;WAIT WITH WAIT INSTRUCTION IOT ;WAIT IN BACKGROUND TEST BR ESH WCWAIT: MOV PRIORITY,@CSR WAIT ;WAIT FOR ASCBIN ; DECIMAL ASCII TO BINARY MOV (SP)+,R4 ; PLACE CONVERTED NUMBER IN R4 TST (SP)+ TST R4 BEQ RTIM4 ; BR IF ZERO CMP R4,#TIMLM BPL RTIM1 ; BRANCH IF OVER TIME LIMIT MOV R4,MAXTM ; SAVE TIME LIMIT RTIM3: JMP RLKGC ; PROCESS NEXT COMMAND RTIM4: CMP @#SWR,#2 ; FOREGROUND OR SYSTEM TASK BEQ RTIM3 ; BR IF YES RTIM ;FORM SKIP FILE COMMAND BR MSKFI4 MSKFI3: INC COUNT(R0) ;INCREMENT COUNT DEC NWORD(R0) BIS #BCKF,R3 ;FORM BACK SPACE FILE COMMAND MSKFI4: MOV R3,@#MTCOMM ;GIVE COMMAND INC R5 ;SET I/O NOT COMPLETE MSKFI2: RTS PC MSKFI5: TST NWORD(R0) BGT MSKFI6 INC NWORD(R0) DEC COUNT(R0) BR MSKFI2 MSKFI6: FLAG ESH: BIT #BIT12,FLAG ;TEST FOR READ BEQ REH ;CHECK BUFFER MOV #INBUF,BUF ;SETUP OUTPUT BUFFER BIC #3,FLAG ;CLEAR RE-READ COUNT DSKRD: MOV #340,@CSR JSR %5,ZBUF ;CLEAR BUFFER INC FLAG READ +100 ;READ + INT ENABLE BIT #BIT9,@SR ;FIND OUT HOW TO WAIT FOR INT. BNE RDWAIT ;WAIT WITH WAIT INSTRUCTION IOT BR ELH RDWAIT: MOV PRIORITY,@CSR ;SET UP PRIORITY WAIT ;WAIT FOR FLAG ELH: BIT #BIT12,@SR BNE ADRD JSR %5,COMPARE ;COMPARE OUTBUFFER TO INBUFFER ADRD: JSR %5,OVRFLOINTER / ARG .BYTE 6 ; SET READ AND WRITE ACCESS .BYTE TSKND-TSKBG/100 ; TPDR 0 .WORD 0,0 ; TPDR 1-2 .WORD 0,0,0 ; TPDR 3-5 .WORD 0,0 ; TPDR 6-7 .WORD TSKBG,0,0 ; TPAR O-2 .WORD 0,0,0 ; TPAR 3-5 .WORD 0,0 ; TPAR 6-7 . = . + 14 .CSECT TSKNTC TSKBG: .WORD 0 .BLKW 177 .ASCII / / FWASC: .WORD 0,0,0 5: MOV #70,R3 ; SET ERROR CODE RTIM6: JMP RLKER ; ERROR EXIT .PAGE ; PROCESS TASK NUMBER COMMAND RLTSK: TST R3 BNE RTSK1 JSR PC,GWORD CMP #1,R3 ; SEMI-COLON BEQ RTSK2 ;YES, BRANCH RTSK1: MOV #67,R3 ; SET ERROR CODE BR GWDER ; ERROR ROUTINE ;*************** CHANGE WHEN KEY SWITCH IS INSTALLED ********** RTSK2: CMP @#SWR,#2 ; DEC NWORD(R0) INC COUNT(R0) BR MSKFI2 .PAGE ; THIS IS A MAGNETIC TAPE CONTROLLER INITIALIZATION ROUTINE ; CALL IS JSR PC,MTINIT ; RETURNS WITH ; R3 = DEVICE NUMBER SHIFTED FOR A COMMAND INSTRUCTION ; R4 = 0 AND (N) BIT SET IF NO ERROR ; R4 = 1 AND (N) BIT CLEAR IF TIME OUT ERROR ; MTINIT: MOV #CLEA,@#MTCOMM ;ISSUE CLEAR TO MAG TAPE CONTROLLER MOVB DEVNUM(R0),R3 ;OBTAIN DEVICE NUMBER ;TEST FOR EXTRA DATE BREAKS MOV FLAG,WORK ;CHECK DISK RE-READ COUNT BIC #177774,WORK ;DO 3 RE-READS. CMP #3,WORK BNE DSKRD ;DO ANOTHER RE-READ REH: BIT #BIT8,@SR BNE DATAT JSR %7,DISBUF ;GO SET UP DISK BUFFER. BR LDAT MSTR: TST FLAG BPL .+6 ;UNDER PROGRAM CONTROL JMP EXTPP ;OPERATOR SELECTED PATTERN ADD #2,PATNU ;INC PATTERN INDEX CMP #44,PATNU BNE DATAT ;NOT LAST PATTERN EXIT CLR PATNU ;LAST PATTERN EXIT ; ;THIS IS A RANDOM DATA, RANDOM ADDRESS ;AND RANDOM WORD COUN ; TEMTORARY ASCII BUFFER .WORD 0 LWASC = . FWRAD: .WORD 0,0,0 ; TEMTORARY RAD50 BUFFER LWRAD = . DACRD: .WORD 80. ; NUMBER OF CHARACTERS TO READ .WORD 0 ; NUMBER ACTUALLY READ FWCRD: .BLKW 40. ; BUFFER LWCRD: .WORD 0 ; LAST WORD OF INPUT TABLE ; TSKNO: .WORD TSKDEF ; TASK NUMBER TSKAC: .BYTE 0 ; TASK ACCESS STATUS HPRIR: .BYTE 0 ; PRIORITY MAXTM: .WORD 0 FOREGROUND OR SYSTEM ? BEQ RTSK3 ; BR IF YES CMP @#SWR,#1 ; BACKGROUND ? BNE RTIM5 ;NO, BRANCH RTSK3: MOV #FWASC,-(SP) EMT ASCBIN ; CONVERT ASCII STRING TO BINARY MOV (SP)+,R4 TST (SP)+ CMP R4,#TASMAX ; WITHIN SYSTEM LIMITS BGT RTSK1 CMP R4,#OVTMIN BLT RTSK1 MOV R4,TSKNO ; SAVE TASK NUMBER JMP ASH #12.,R3 ;LEST SHIFT 0&1 INTO 12&13 MOV R3,@#MTCOMM ;STORE UNIT NUMBER IN COMMAND REGISTER BIS #1000,R3 ;SET INTERRUPT ENABLE BIT ; CLEAR BACK SPACE FLAG AND SET DELAY COUNTER TO ZERO CLRB RES1+1(R0) ;CLEAR BACK SPACE FLAG CLR R4 ; TEST READY BIT CMP FUNCT(R0),#1 ;OPEN COMMAND BEQ MTIN3 MOVB @#MTSTAT,R1 ;LOAD WITH BYTE SIGN EXTENDED BGT MTIN2 ;BT ; ;WORD COUNT CAN BE EQUAL TO OR LESS THAN 1000 WORDS ; RANEX: MOV #-1000,PASSC MOV #1000,%6 BIC #BIT9,FLAG MOV #RANER,HRDER ;SET UP FOR HARD ERROR MOV PRIORITY,@CSR ;SET PRIORITY TO LEVEL 5 WRLG: MOV #3,WORK ;GENERATE RANDOM WORD MOV #OUTBUF,%1 JSR %5,RANDOM BIC #177003,OUTBUF ; MASK FOR WORD LENGTH BEQ WRLG MOV OUTBUF,WRDCT ;SET UP WORD COUNT MOV OUTBUF+2,DMA ;SET UP DAR BIC #177700,DMA BIC #177000,OUTBUF+4 BIT #400,OUTBUF+4; MAXIMUM TIME DEVPG: .WORD 0 ; DEVICE PAGE FLAG ; ; CARD READER LIST CSIOB: IOCBM 2,2,0,0,3,DACRD TYIOB: IOCBM 0,2,0,0,0,TYMES TYMES: .WORD 14,0 .ASCII /TSKNTR MSG/ TYNUM: .BYTE 40,40 ; SET ERROR NUMBER CODE .BOUND BFBLK1: .WORD 0 ; STATUS CODE .WORD 0 ; ID OF ROS FILE BFNAM: .WORD 0,0 ; ELEMENT NAME BFSTAT: .BYTE 0 BFTYPE: .BYTE 1 ; ELEMENT TYPE BFSECT: RLKGC ; PROCESS NEXT COMMAND .PAGE ; PROCESS EXIT COMMAND RLXIT: TST SAVR0 ; TEST INPUT ARGUMENT BGE RLXI1 ; BR IF NOT QUEUED BY BATCH EMT NOCKPT MOV #$BT1NO,-(SP) CLR -(SP) EMT UNSPND RLXI1: EMT EXIT ; GET NEXT WORD FROM ROSLNK 3 CONTROL CARDS ; ; INPUT: RO = FWA OF TASK HEADER ; R1 = CHARACTER POINTER ; ; R2 IS USED AS A CHARACTER POINTER TO THRANCH IF BIT 7 WAS 0 MTIN3: RTS PC ;RETURN MTIN2: MOV #11,R4 BR MTIN3 ; ; ; DEQUEUE THE REQUEST MTDEQ: MOV R4,ERROR(R0) DEC NMTREQ MOV @#MTSTAT,STATUS(R0) MOV @#PS,-(SP) ;SAVE CURRENT CPU STATUS REGISTER SPL 7 ;INHIBIT INTERRUPTS MOV (R0),MTFRST ;PUT NEXT GUY IN THRAED AT TOP OF QUEUE BNE MTDEQ2 MOV #MTFRST,MTLAST BEQ .+6 DEC OUTBUF+4 MOV OUTBUF+4,TRACK ;SET UP DAE MOV WRDCT,WORK ;GENERATE RANDOM MOV #OUTBUF,%1 ;DATA BUFFER JSR %5,RANDOM MOV #OUTBUF,BUF BIS #BIT8,@DCS ;CLEAR THE DISK WRITE +100 ;WRITE DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK +100 ;WRITE CHECK DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT MOV #INBUF,BUF ;SET UP BUFFER JSR %5,ZBUF ;CLEAR BUFFER AREA READ +100 ;READ DATA BIT #B.WORD 0 ; RELATIVE START SECTOR BFSIZE: .WORD 0 ; LENGTH IN SECTORS .BOUND TXTLST: .WORD 1 .BYTE 1,2 ; DISC / SUSPEND .WORD 0 ; EXIT .BYTE 0,3 ; ERROR / LEVEL TXTERR: .WORD 0,0 ; ERROR WORD / RESERVED .WORD TXTHED ; BUFFER HEADER ADDRESS .WORD 0,0 ; TXTHED: .WORD $BCHID ; FILE I D FOR BATCH FILE .BYTE 0 E ASCII BUFFER ; ; OUTPUT: THE WORD WILL BE PLACED IN (TMASC) AND R3 WILL INDICATE DELIMITER ; R3 = 0 EQUAL SIGN ; R3 = 1 SEMI-COLON ; GWORD: MOV R2,-(SP) MOV R4,-(SP) MOV #FWASC+6,R2 MOV #20040,R3 ; 2 SPACE CODES MOV R3,-(R2) MOV R3,-(R2) MOV R3,-(R2) GWD1: CMP #LWCRD,R1 ; IS CARD BUFFER EMPTY BEQ GWD3 ; BR IF AT END MOVB (R1)+,R4 MTDEQ2: MOV #1,(R0) ;SET LIST READY MOV (SP)+,@#PS ;UN-INHIBIT THE INTERRUPTS MOV SYSTEM(R0),R2 ;GET TASK NUMBER OF REQUESTOR BEQ MTDEQ1 ;BRANCH IF NOT A TASK DECB IOSTAT(R2) ;OTHERWISE, DECREMENT THE I/O IN PROGRES BNE MTDEQ1 MOV R2,-(SP) ;GO TO OVERLAY MONITOR SO THE TASKS CORE JSR PC,RELTSK ; CAN BE RELEASED MTDEQ1: RTS PC .END IT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %5,COMPARE ;COMPARE OUT BUFFER TO IN BUFFER JSR %5,OVRFLO ;TEST FOR EXTRA DATA BREAKS RANER: BIT #BIT9,FLAG ;CHECK FOR ERROR BEQ EXRAX BIC #BIT9,FLAG JSR %5,CONV DMA MES1 6 JSR %5,CONV TRACK MES1A 2 JSR %5,CONV WRDCT MES3 4 EMT+0 HED6 MES1A MES1 MES3 -1 EXRAX: INC PASSC ;HAVE WE DONE IT 1000 TIMES BNE WRLG ;BRANCH IF NO BIT #BIT11,@SR ;LOOP ON TEST BEQ .+6 ;BRANCH IF YES JMP RANEX ; ; RELATIVE SECTOR TXTR.W: .BYTE 0 .WORD 0,0,0 TXTSEC: .WORD 0 ;RELATIVE SECTOR TO READ OR WRITE TXTCNT: .WORD 40 ; NUMBER OF WORDS TO TRANSFER TXTBK1: .BLKW 40 ; .BOUND DFLIST: .WORD 1 ; "DEFINE FILE" LIST .BYTE 0,0 ; ERROR , ERRTSK .WORD 0 ; IFD .WORD 0 ; FILE I.D. .WORD 0 ; FILE TYPE .WORD 0 ; ; GET CHARACTER CMP R4,#SPAC ; SPACE ? BEQ GWD1 ; YES BRANCH CLR R3 ; R3 = 0 CMP R4,#EQSN ; = ? BEQ GWEX ; YES INC R3 ; R3 = 1 CMP R4,#SCOL ; ; ? BEQ GWEX ; YES CMP R4,#COMA ; , ? BNE GWD7 ; NO GWEX: MOV (SP)+,R4 MOV (SP)+,R2 RTS PC GWD7: ;CHECK FOR MULTI DISK MODE ;IF IN MULTI DISK MODE REPORT "END" ;IF LAST DISK ON SYSTEM HAS BEEN ;EXERCISED. ; ; CLR DMA CLR TRACK BIT #BIT11,FLAG ;ARE WE IN MULTI DISK MODE BEQ REPOEN ;REPORT "END" MOV FLAG,WORK ;WHAT DISK ARE WE ON BIC #177743,WORK ;IF LAST DISK ON SYSTEM CMP WORK,DSKNOR ;REPORT END BEQ REPOEN ;REPORT "END" LAST DISK ADD #4,FLAG ;INC. DISK NO. BR EXTPP ;EXERCISE DISK REPOEN: EMT +1 END ;REPORT END OF PASS BIC #34,FLAG EXTPP: JMP ADTST ;RECYCLE ; ;# SECTORS IN FILE ; ROSLNK COMMAND LIST RKLCL: .RAD50 /ACC/ ; ACCESS STATUS .RAD50 /DEV/ ; DEVICE PAGE .RAD50 /END/ ; END .RAD50 /NAM/ ; NAME .RAD50 /PRI/ ; PRIORITY .RAD50 /TIM/ ; TIME LIMIT IN SECONDS .RAD50 /TSK/ ; TASK NUMBER .WORD 0 ; ; ROSLNK COMMAND PROCESSOR JUMP TABLE RLKJT: .WORD RLACC ; ACCESS STATUS .WORD RLDEV MOVB R4,(R2)+ ; NO, PLACE CHARACTER IN TEMB CMP #LWASC,R2 ; COMPAIR CHAR POINTER WITH END OF TABLE BNE GWD1 ; NO MOV #71,R3 ; SET ERROR CODE BR GWDER GWD3: ; INSERT ROS CARD READ COMMAND MOV #CSIOB,-(SP) EMT CREAD ; READ A CARD MOV #FWCRD,R1 ; RESET CHARACTER POINTER CMP @R1,#DOLR ; ROS 3 CONTROL CARD BNE GWD1 MOV ENTER DISK HANDLER BY THE TRAP INSTRUCTION ;ARGUMENT TO TRAP INSTRUCTION IS TWO ORDER ;BYTE OF THE CONTROL REGISTER. ; DISK: MOV R5,-(SP) MOV R1,-(SP) MOV R0,-(SP) MOV DAR,R5 MOV TRACK,R0 BIC #177000,R0 ASH #6,R0 MOV DMA,R1 BIC #177700,R1 ADD R1,R0 MOV R0,(R5) ; LOAD DAR MOV BUF,-(R5) ; LOAD CMA MOV WRDCT,-(R5) ; LOAD WC ; DEVICE PAGE .WORD RLEND ; END .WORD RLNAM ; NAME .WORD RLPRI ; PRIORITY .WORD RLTIM ; TIME LIMIT .WORD RLTSK ; TASK NUMBER ; ; TASK ACCESS STATUS MNEMONICS AND ASSOCIATED BIT SETTINGS ACCTB: .RAD50 /BCH/ ; BATCH TASK .WORD 1 .RAD50 /BCF/ ; FLOATING POINT BATCH TASK .WORD 11 .RAD50 /BKG/ ; BACKGROUND TASK .WORD 2 #63,R3 ; SET ERROR CODE GWDER: JMP RLKER ; ERROR .PAGE REGSAV: MOV R4,-(SP) ; RK PUSHED BY "JSR" MOV R3,-(SP) ; SAVE REST MOV R2,-(SP) MOV R1,-(SP) MOV R0,-(SP) JMP (R5) ; ; REGPOP: TST (SP)+ ; POP UNNEEDED R5 MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 RTS ;YES BIT 11 SET IN SR ; ; ; ; ; ; ; SPIRAL TEST EXT. ; ;WRITE TWO WORDS OF DATA ;STARTING WITH THE LAST ADDRESS OF TRACK0 ;DATA PATTERN = 25252 ;THEN READ THE DATA DOING ONE WORD ;X-FERS XSPIRAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PROCESSING MOV #1000,%6 ;SET UP STACK MOV #25252,OUTBUF ;SET UP DATA WORD 1 MOV #25252,OUTBUF+2 ;SET UP DATA WORD 2 MOV #2,WRDCT ;SET UP WORD COUNT MOV #OUTBUF,BUF ;SET UP CMA CLR TRACK ;SET UP DISK ADDR. MOV #3777,DMA WRITE NEG (R5) MOV 6(6),%1 MOV -(1),WORK BIC #177600,WORK ;MASK FUNCTION BITS MOV WORK,-(5) ;LOAD FUNCTION REG. MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R5 RTI ;RETURN FROM TRAP ; ; ; ; ; ; ; ;RF11 DISK INTERRUPT HANDLER ;ROUTINE CONTINUES ON ERRORS ; DKINT: BIC #BIT4,@CSR ;CLEAR TRACE BIT TST @DCS ;TEST FOR ERROR BPL INTEXT ;BRANCH IF NO ERROR BIS #BIT9,FLAG ;SET ERROR BIT MOV @DAE,WORK ;REPORT ERROR BIC # .RAD50 /BKF/ ; FLOATING POINT BACKGROUND TASK .WORD 12 .RAD50 /FCD/ ; FOREGROUND TASK .WORD 4 .RAD50 /FGF/ ; FLOATING POINT FOREGROUND TASK .WORD 14 .RAD50 /SYS/ ; SYSTEM TASK .WORD 20 .RAD50 /SYF/ ; FLOATING POINT SYSTEM TASK .WORD 30 .WORD 0 ; END FLAG ; BSZTAB: ;TABLE OF MAX ALLOWABLE BLOCK OR "PAGE SIZES FOR EACH PRIORITY ;THE SIGN BIT IS SET R5 ; TEXTIO: MOV #TXTLST,-(SP) EMT NOCKPT ; STAY IN CORE DURING I/O EMT DISCIO ; READ OR WRITE EMT CKPT ; ALLOW SWAP OUT TST TXTERR ; ANY ERRORS BNE LDR05 RTS PC LDR05: MOV #105,R3 ; LOAD ERROR CODE JMP RLKER TSKND: .END  ;WRITE DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X1SPIL ;BRANCH IF NO ERROR MOV @DCS,WORK MOV #23,ERCOUNT ;SET UP ERROR COUNT ER23: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR XSPIRAL X1SPIL: DEC WRDCT ;SET UP FOR 1 WORD X-FER MOV #3777,DMA ;SET UP DAR MOV #INBUF,BUF ;SET UP CMA READ ;READ DAR 3777 TSTB @DCS ;TEST FOR NOT READY BPL .-4 ;CONTROL STILL BUSY TST @D177700,WORK ;MASK ADDRESS EXT. BITS. JSR %5,CONV ;CONVERT TO ASCII WORK MES1A 2 EMT+1 HED2 MOV @DCS,WORK ;TEST FOR READ BIC #177770,WORK CMP #4,WORK BNE DELMES ;IF READING REPORT WHICH READ MOV FLAG,WORK BIC #177774,WORK JSR %5,CONV WORK MES13 1 EMT+1 MES13 DELMES: MOV @DAR,WORK ;SET UP LOWER 16 BITS OF ADDR. DEC WORK JSR %5,CONV ;CONVERT TO ASCII WORK MES1 6 EMT+0 MES1A MES1 -1 MOV @DCS,WORK ;SET UP STATUS JSR %5,CONV WORK MES2 6 EM IF THE PRIORITY IS DYNAMIC, I.E. NOT FIXED ;NOR TIME-SLICE. .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!$PS007 .WORD PRIP08&100000!$PS008 .WORD PRIP09&100000!$PS009 .WORD PRIP10&100000!$PS010 .WORD PRIP11&100000!$PS011 .WOR; DDCGTP.S05 ; DDCGTP.S04 ; DDCGTP.S03 AUG-28-73 ; DDCGTP.S02 ; DDCGTP.SO1 AUG-24-73 ; DDCGTP.S00 AUG-21-73 .TITLE DDCGTP ( D D C GENERAL TEST PROGRAM ) BIT0=1 BIT1=2 BIT2=4 BIT3=10 BIT4=20 BIT5=40 BIT6=100 BIT7=200 BIT8=400 BIT9=1000 BIT10=2000 BIT11=4000 BIT12=10000 BIT13=20000 BIT14=40000 BIT15=100000 R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 NO = 67 ; WRITE=TRAPCS ;TEST FOR ERROR BPL X2SPIL ;BRANCH IF NO ERROR MOV #24,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTROL REG ER24: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE THE ERROR **** BR XSPIRAL ;LOOP ON ERROR X2SPIL: CMP #25252,INBUF ;IS ADDR 3777 CORRECT BEQ X3SPIL ;BRANCH IF NOT EQUAL MOV #25,ERCOUNT ;SET UP ERROR COUNT MOV #25252,WORK1 ;GOOD DATA MOV OUTBUF,WORK ;DATA DATA ER25: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR.3777 T+1 MES2 BIT #BIT14,@DCS ;TEST FOR HARD ERROR BEQ SOFTER ;GO AND CONTINUE SOFT ERROR MOV @DAE,WORK ;FETCH ERROR EXT. BITS SWAB WORK BIC #177400,WORK JSR %5,CONV ;CONVERT TO ASCII WORK MES2A 3 EMT+0 HED5A MES2A -1 BIS #BIT8,@DCS ;CLEAR THE DISK MOV #1000,%6 BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT 10 SET IN SR JMP @HRDER ;EXIT HARD ERROR SOFTER: TST @WC ;CHECK FOR X-FER DONE BEQ INTEXT ;EXIT FROM ROUTINE BIT #BIT9,@SR BEQ .+6 SUB #2,D PRIP12&100000!$PS012 .WORD PRIP13&100000!$PS013 .WORD PRIP14&100000!$PS014 .WORD PRIP15&100000!$PS015 .WORD PRIP16&100000!$PS016 .PAGE TSKNTR: ; TASK ENTER MOV #LWCRD,R1 ; SET CHARACTER POINTER SO A CARD WILL BE READ RLKGC: JSR PC,GWORD ; GET NEXT COMMAND MOV #FWASC,-(SP) ; ASCII BUFFER ADDRESS MOV #FWRAD,-(SP) ; RAD50 BUFFER ADDRESS EMT R50PAK MO+3 WRCHECK=TRAP+7 READ=TRAP+5 ; ; ;DDC DATA TEST PROGRAM ;VECTORS USED IN PROGRAM ;#1 LOC 130,134,140,144,150,154,160,164 DISK INTERRUPT ;#2 LOC 30 EMT (TELETYPE OUTPUT) ;#3 LOC 34 TRAP (DISK HANDLERS) ;#4 LOC 14 TRACE TRAP (USED IN BACKGROUND TEST) ;#5 LOC 20 IOT TRAP (USED IN CALLING BACKGROUND TEST) ; ;I/O ADDRESS POINTERS SR: 177570 ;SWITCH REGIISTER CSR: 177776 ;PROCESSOR STATUS REGISTER TPB: 177566 ;TELETYPE REGISTERS TKB: 177562 TPS: 177564 TKS: 177560 ; ;DISK I/O REGOF TRACK 0 **** ;****WRD2=THE DATA THAT WAS READ FROM ADDR. 3777 OF TRACK 0 **** BR XSPIRAL ;LOOP ON ERROR X3SPIL: INC DMA ;SET UP TO READ ADDR 4000 READ ;READ DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X4SPIL ;BRANCH IF NO ERROR MOV #26,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTROL REG. ER26: JSR %5,STAER ;REPORT ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR XSPIRAL ;LOOP ON ERROR X4SPI (6) ;X-FER NOT DONE SET UP FOR RETURN BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT10 SET IN SR BIS #BIT0,@DCS ;SET GO AND CONTINUE RTI ;RETURN TO WAIT INSTR. ; ; INTEXT: BIT #BIT13,@SR ;HALT ON COMPLETION FLAG BEQ .+4 HALT ;YES BIT 13 SET IN SR HALT BIT #BIT9,@SR BNE .+6 MOV #774,%6 ;RESET STACK RTI ;EXIT ; ; ;ROUTINE TO SET UP DAR AND DAE ;FROM SR AND CONVERSATION ;ENTER FROM JSR %5,OPDSEL OPDSEL: BIT #BIT7,@SR ;DOES SR CONTAIN TRACK # BNE .+4 RTS V FWRAD,R2 MOV #RKLCL,R4 ; SET POINTER TO COMMAND LIST RLKA1: TST (R4) ; AT END OF LIST BNE RLKA2 ;YES, BRANCH MOV #61,R3 ; SET ERROR CODE BR RLKER ; ERROR ROUTINE RLKA2: CMP (R4)+,R2 ;NO, TEST COMMAND BNE RLKA1 ; BRANCH IF NOT A COMMAND SUB #RKLCL,R4 ; DETERMINE COMMAND INDEX SUB #2,R4 ; R4=R4-2 JM ISTERS ; DCS: 177460 ;DISK CONTROL REGISTER WC: 177462 ;WORD COUNT REGISTER CMA: 177464 ;CURRENT ADDRESS REGISTER DAR: 177466 ;LOWER 16 BITS OF DISK ADDRESS DAE: 177470 ;EXTENSION ADDRESS REGISTER DBR: 177472 ;DATA BUFFER REGISTER MA: 177474 ;MAINTENANCE REGISTER ADS: 177476 ;LOOK AHEAD REGISTER VECTOR: 204 ;INTERRUPT VECTOR ADDRESS STATUS: 206 ;DISK INTERRUPT STATUS PRIORITY:BIT7 ;DISK PRIORITY LEVEL ; ; ; ; ; ; ;RF11 DEDICATE REGISTERS (MEMORY) ; FLAG: 0 ;I L: CMP #25252,INBUF ;CMP DATA BEQ LPXSPIL ;BRANCH IF DATA OK MOV #27,ERCOUNT ;SET UP ERROR COUNT MOV #25252,WORK1 ;GOOD DATA MOV INBUF,WORK ;DATA DATA ER27: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR. 0 OF TRACK 1 **** ;****WRD2=THE DATA THAT WAS READ FROM ADDR. 0 OF TRACK 1 **** BR XSPIRAL ;LOOP ON ERROR LPXSPIL:BIT #BIT11,@SR ;LOOP ON TEST? BNE XSPIRAL ;YES BIT11 SET IN SR, CLRREG: CLR DMA ;CLEAR WORD ADDRESS CLR TRACK ;CLEAR TRACK ADDRESS ; ; ; ; %5 MOV @SR,R0 ; FETCH SW BIC #177600,R0 BIC #177,TRACK BIS R0,TRACK MOV #0,DMA ; USE MOV RATHER THAN CLR FOR PATCHING RTS %5 ;EXIT ; ;ROUTINE TO SETUP DISK BUFFERS ;ADD WORD COUNT TO STARTING DISK ADDRESSES ;COMPARE CALCULATED ADDRESS TO TERMINATING ADDRESS ; DISBUF: MOV WRDCT,R1 ASH #-6,R1 ; CONVERT TO SECTION ADD DMA,R1 MOV TRACK,R2 ASH #6,R2 P @RLKJT(R4) ; JUMP TO COMMAND PROCESSOR RLKER: MOVB R3,TYNUM+1 ; SET ERROR CODE TO BE PRINTED MOV #TYIOB,-(SP) ; LIST ADDRESS EMT TTYOUT EMT EXIT .PAGE ; PROCESS TASK ACCESS STATUS RLACC: TST R3 ; EQUAL SIGN DELIMITER BNE RLAC1 JSR PC,GWORD ;GET TASK ACCESS STATUS CMP R3,#1 ; TEST FOR SEMI-COLON BEQ RLAC2 ; RLAC1:NTERNAL PROGRAM FLAG RANNU: 146723 ;RANDOM NUMBER PRIME WRDCT: 0 ;WORKING WORD COUNT TRACK: 0 ;WORKING DAE DMA: 0 ;WORKING DAR PATNU: 0 ;DATA PATTERN INDEX BUF: 0 ;WORKING DATA BUFFER (OUT-IN) TWRDCT: 0 ;TEMP WORD COUNT TDMA: 0 ;TEMP DAR SWRDCT: 0 ;STANDARD WORD COUNT ERCOUNT:0 ;ERROR COUNT FOR MESSAGES. SAVE: 0 SAV1: 0 PASS: 0 DSKNOR: 0 ;NUMBER OF DISKS ON THE SYSTEM HRDER: 0 ;POINTER FOR HARD ERROR PASSC: 0 ; ;RF11 WORK REGISTERS ;(CAN BE ; ; ; ; ; ; DATAT: MOV SWRDCT,WRDCT MOV #LDAT,HRDER ;SETUP FOR HARD ERROR MOV #340,@CSR ;LOCK UP PROCESSOR PRIORITY JSR %5,PASEL ;SET UP DATA BUFFERS LDAT: JSR %5,OPDSEL ;SET UP DISK ADDRESS BIT #BIT14,FLAG ;TEST FOR WRITE BEQ SLH ;TEST FOR WRITE CHECK MOV #OUTBUF,BUF ;SETUP OUTPUT BUFFER WRITE +100 ;WRITE WITH INT. ENABLED BIT #BIT9,@SR ;FIND OUT HOW TO WAIT FOR INT BNE WRWAIT ;WAIT WITH WAIT INSTRUCTION IOT ;WAIT IN BACKGROUND TEST BR SLH WRWAIT: MOV PRIORITY,@CSR WA ADD R1,R2 INC R2 MOV R2,WORK1 ; SET UP WORK1 IN CASE OF AN ERROR COMDAR: CMP R2,@DAR BEQ CMDAE BIS #BIT6,FLAG CMDAE: BIT #177700,R1 BEQ 2$ SUB #100,R1 ADD #1,TRACK ; USE ADD RATHER THAN INC FOR TEST PATCHING BIT #177000,TRACK BEQ 1$ CLR TRACK CLR R1 ADD #2,(6) ; INC STACK POINTER 1$: BIC #177700,R1 2$:  MOV #62,R3 ; SET ERROR CODE BR RLKER ; ERROR ROUTINE RLAC2: MOV #FWASC,-(SP) MOV #FWRAD,-(SP) EMT R50PAK MOV FWRAD,R2 ; PLACE ACCESS CODE IN R2 MOV #ACCTB-2,R4 ; SET POINTER TO TABLE - 2 RLAC3: CMP #30,(R4)+ ; TEST FOR END OF TABLE BEQ RLAC1 ; BRANCH IF AT END OF TABLE CMP (R4)+,R2 ; COMPAIR INPUT COMMAND WITH TABLE ENTRY BNCHANGED IN ANY ROUTINE) WORK: 0 WORK1: 0 WORK2: 0 WORK3: 0 WORK4: 0 WORK5: 0 BEGIN: RESET CLR R0 ; CLEAR INTERRUPT VECTORS MOV #2,R1 MOV #4,R2 1$: MOV R1,(R0) ; SET INTERRUPT VECTOR TO .+2 CLR (R1) ; HALT 3$: ADD R2,R0 ADD R2,R1 CMP #14,R0 ; 14 & 16 ARE NEEDED FOR ODT BEQ 3$ CMP #200,R0 ; DONE BNE 1$ IT ;WAIT FOR FLAG SLH: BIT #BIT13,FLAG ;TEST FOR WRITE CHECK BEQ ESH ;TEST FOR READ MOV #OUTBUF,BUF ;SETUP OUTPUT BUFFER MOV #340,@CSR WRCHECK +100 ;WRITE CHECK WITH INT. ENABLE BIT #BIT9,@SR ;FINDOUT HOW TO WAIT FOR INT. BNE WCWAIT ;WAIT WITH WAIT INSTRUCTION IOT ;WAIT IN BACKGROUND TEST BR ESH WCWAIT: MOV PRIORITY,@CSR WAIT ;WAIT FOR FLAG ESH: BIT #BIT12,FLAG ;TEST FOR READ BEQ REH ;CHECK BUFFER MOV #INBUF,BUF ;SETUP OUTPUT BUFFER BIC #3,FLAG ;CLEAR RE-READ COUNT  MOV R1,DMA BIT #BIT6,FLAG ;REPORT ADDRESS ERROR BNE .+4 EXTDR: RTS %7 ;EXIT ERADR: JSR %5,CONV ;CONVERT DMA REG COUNT TO ASCII DMA MES1 6 JSR %5,CONV ;CONVERT TRACK REG COUNT TO ASCII WORK1 MES1A 2 EMT +0 ;REPORT ERROR HED4 MES1A MES1 -1 BIC #BIT6,FLAG CLR DMA ;DISK ADDRESS ERROR RE-START PROG. CLR TRACK BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;SWITCH 10 SET IN SR HALT RTS %7 ; ; ; ;ROUTINE TO SELECT DATA PATTERNS FOR TEST ; ;ENTER FROM JSRE RLAC3 ; TRY NEXT ENTRY IN TABLE MOVB (R4),TSKAC ; SAVE ACCESS CODE JMP RLKGC ; PROCESS NEXT COMMAND ; ; PROCESS DEVICE PAGE COMMAND RLDEV: CMP #1,R3 ; TEST FOR SEMI-COLON BEQ RLDEV1 MOV #71,R3 ; SET ERROR CODE BR RLKER RLDEV1: INC DEVPG ; SET DEVICE PAGE FLAG BR RLKGC ; GO PROCESS NEXT COMMAND .PAGE ; PROCESS END COMMA ; NO ; BACKGROUND TEST VECTOR MOV #XWAIT,@#20 CLR @#22 ; SET EMT TRAP VECTOR MOV #EMTRP,@#30 ; TTY VECTOR MOV #340,@#32 MOV #DISK,@#34 ; DISK CALLING VECTOR MOV #340,@#36 ; SET UP INTERRUPT VECTORS FOR D.D.C. DISK MOV #130,R0 MOV #132,R1 2$: MOV #DKINT,(R0) ; INTERRUPT ROUTINE MOV #200,(R1) ; PSR ADD R2,R DSKRD: MOV #340,@CSR JSR %5,ZBUF ;CLEAR BUFFER INC FLAG READ +100 ;READ + INT ENABLE BIT #BIT9,@SR ;FIND OUT HOW TO WAIT FOR INT. BNE RDWAIT ;WAIT WITH WAIT INSTRUCTION IOT BR ELH RDWAIT: MOV PRIORITY,@CSR ;SET UP PRIORITY WAIT ;WAIT FOR FLAG ELH: BIT #BIT12,@SR BNE ADRD JSR %5,COMPARE ;COMPARE OUTBUFFER TO INBUFFER ADRD: JSR %5,OVRFLO ;TEST FOR EXTRA DATE BREAKS MOV FLAG,WORK ;CHECK DISK RE-READ COUNT BIC #177774,WORK ;DO 3 RE-READS. CMP #3,WORK BNE DSKRD ;DO ANOTH %5 PASEL ; PASEL: MOV PATNU,%0 ;SET UP PATTERN NUMBER MOV WRDCT,WORK ;SET UP WORK MOV #OUTBUF,%1 ;LOC. OF OUTBUFFER CMP #42,%0 ;TEST FOR RANDOM DATA NUMBER BEQ RANDOM ;GO GENERATE RANDOM DATA FILDAT: MOV PAT0(0),(1)+ ;FILL BUFFER DEC WORK ;DEC. WORK COUNT BNE FILDAT ;LOAD NEXT WORD RTS %5 ;BUFFER FULL ; ;RANDOM DATA ; ; ;RANDOM DATA GENERATOR SUBROUTINE RANDOM: MOV LONUM,%0 ;SET UP R0 WITH 5 DIGITS LOW MOV HINUM,%4 ;SET UP R1 WITH 5 DIGITS HIGH MOV #7,%3 ;SET UP SHIFT COU R0+,P)(S V MO ET YOT;N D2MOSR O BL S?NEFIDEF OND EEDCHEA;R E YM,SR0 P CM: D1MOSR D LSF ORTTA;S R0N,BGSD#L V MO ITE AV;S P)(S,-R0 V MO NDOU FOT;N BR B ; NDOU;F AR B ; DNMOSRC, PSR J : LLCA ; NDOU FOT NIFD GEANCHUN4 R ; D)UNFOF (ID LSN IMENAO TTSINPO4 RT:PUUT O ; MENA0 D5RAO TTSINPO4 R: UTNP*ND RLEND: CMP #1,R3 ; TEST FOR SEMI-COLON BEQ RLED2 RLED1: MOV #63,R3 ; SET ERROR CODE JMP RLKER ; BR TO ERROR ROUTINE RLED2: CMP TSKNO,TSKDEF ; IS THIS A BATCH TASK BEQ RLED3 ;******* CHANGE WHEN KEY SWITCH IS INSTALLED ********************** CMP @#SWR,#1 BEQ RLED3 CMP @#SWR,#2 BNE RLED1 RLED3: MOV #BFBLK1,-(SP) EMT BFOPEN ER RE-READ REH: BIT #BIT8,@SR BNE DATAT JSR %7,DISBUF ;GO SET UP DISK BUFFER. BR LDAT MSTR: TST FLAG BPL .+6 ;UNDER PROGRAM CONTROL JMP EXTPP ;OPERATOR SELECTED PATTERN ADD #2,PATNU ;INC PATTERN INDEX CMP #44,PATNU BNE DATAT ;NOT LAST PATTERN EXIT CLR PATNU ;LAST PATTERN EXIT ; ;THIS IS A RANDOM DATA, RANDOM ADDRESS ;AND RANDOM WORD COUNT ; ;WORD COUNT CAN BE EQUAL TO OR LESS THAN 1000 WORDS ; RANEX: MOV #-1000,PASSC MOV #1000,%6 BIC #BIT9,FLAG MOV #RANER,HRDER ;SET NT CLR %2 ;CLEAR R2 SHIFT: ASL %0 ;SHIFT R0 LEFT AND ROL %4 ;ROTATE CARRY INTO LSB OF R1 INTO ROL %2 ;ROTATE CARRY OUT OF R1 INTO R2 DEC %3 ;DECREMENT R3 BNE SHIFT ;CONTINUE SHIFT LOOP ADD LONUM,%0 ;ADDN IN NUMBER TO MAKE X 129 ADC %4 ;PROPOGATE CARRY ADD HINUM,%4 ;ADDN IN NUMBER TO MAKE X 129 ADC %2 ;PROPOGATE CARRY ADD #1057,%0 ;ADDN LOW CONSTANT ADC %4 ;PROPOGATE CARRIES ADC %2 ;PROPOGATE AGAN ADD #47401,%4 ;ADDN HIGH CONSTANT ADC %2 ;PROPOGATE CARRY ADD #6,%2 0 ADD R2,R1 CMP #170,R0 ; DONE BNE 2$ ; NO ; SET UP START ADDRESS MOV #137,@#200 ; JMP MOV #START,@#202 ; SET UP JUMP INSTRUCTIONS MOV #600,R0 MOV #137,(R0)+ ; JMP MOV #ADT2,(R0)+ ; EXTRANEOUS DATA ALTERATION TEST MOV #137,(R0)+ ; JMP MOV #ADT3,(R0)+ ; SECTOR ADDRESSING TEST MOV #137,(R0)+ ; JMP  MOV BFSECT,TXTSEC ; SET TO READ IN TASK HEADER INFO CLRB TXTR.W ; SET READ FLAG JSR PC,TEXTIO MOV TSKNO,TXTBK1+2 ; MOVE TASK NUMBER MOV TSKAC,TXTBK1+4 ; MOVE PRIORITY AND TASK ACCESS STSATUS MOV HPRIR,R2 TSTB PPTAB+$ROSM(R2) ; IS THIS A TIME-SLICING PRIORITY BLE RLD04 ; NO TST MAXTM ; YES EXECUTION TIME MUST BE SPECIFIED BLE RLKER RLD04: UP FOR HARD ERROR MOV PRIORITY,@CSR ;SET PRIORITY TO LEVEL 5 WRLG: MOV #3,WORK ;GENERATE RANDOM WORD MOV #OUTBUF,%1 JSR %5,RANDOM BIC #177000,OUTBUF ;MASK FOR WORD LENGTH=1K BEQ WRLG MOV OUTBUF,WRDCT ;SET UP WORD COUNT MOV OUTBUF+2,DMA ;SET UP DAR ADD WRDCT,DMA BCS WRLG MOV OUTBUF+2,DMA BIC #177774,OUTBUF+4 MOV OUTBUF+4,TRACK ;SET UP DAE MOV WRDCT,WORK ;GENERATE RANDOM MOV #OUTBUF,%1 ;DATA BUFFER JSR %5,RANDOM MOV #OUTBUF,BUF BIS #BIT8,@DCS ;CLEAR THE DISK WRITE +100 ! ;ADDN HIGHEST CONSTANT ADD %2,%0 ;REPRIME R0 WITH HIGH DIGIT ADC %4 ;PROPOGATE CARRY MOV %0,LONUM ;PUT R0 BACK IN LONUM MOV %0,(1)+ ;HOLD LONUM FOR PROGRAM DEC WORK BEQ EXGEN MOV %4,HINUM ;PUT R1 BACK IN HINUM MOV %4,(1)+ ;HOLD HINUM FOR PROGRAM DEC WORK BNE RANDOM EXGEN: RTS %5 ;RETURN T PROGRAM LONUM: 0 HINUM: 0 ; ; .EVEN ; ;RF11 DATA PATTERNS ; PAT0: 0 PAT1: 177777 PAT2: 134510 PAT3: 043267 PAT4: 100000 PAT5: 107070 PAT6: 070707 PAT7: 052525 PAT10: 1252" MOV #ADT4,(R0)+ ; TRACK ADDRESSING TEST MOV #137,(R0)+ ; JMP MOV #ADT5,(R0)+ ; LOOK AHEAD REGISTER TEST MOV #137,(R0)+ ; JMP MOV #SPIRAL,(R0)+ ; SEQUENTIAL TRACK ADDRESSING FOR READ MOV #137,(R0)+ ; JMP MOV #XSPIRL,(R0)+ ; SEQUENTIAL TRACK ADDRESSING FOR WRITE MOV #137,(R0)+ ; JMP MOV #RANEX,(R0)+ ; DATA PATTERN TEST (WITH OPTIONAL BACKGROUND) CLR # MOV MAXTM,TXTBK1+10 ; MOVE MAX TIME TST DEVPG BEQ RLED4 ; BR IF DEVICE PAGE NOT DESIRED MOV #102,R3 ; SET ERROR CODE TST TXTBK1+42 ; TEST TPDR 7 BNE RLKER ; BR IF IN USE MOV #77406,TXTBK1+42 ; SET TPDR7 MOV #7600,TXTBK1+62 ; SET TPAR 7 RLED4: INCB TXTR.W ; SET WRITE FLAG JSR PC,TEXTIO MOVB HPRIR,R2 ; LOAD PRIOR$ ;WRITE DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK +100 ;WRITE CHECK DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT MOV #INBUF,BUF ;SET UP BUFFER JSR %5,ZBUF ;CLEAR BUFFER AREA READ +100 ;READ DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %5,COMPARE ;COMPARE OUT BUFFER TO IN BUFFER JSR %5,OVRFLO ;TEST FOR EXTRA DATA BREAKS RANER: BIT #BIT9,FLAG ;CHECK FOR ERROR BEQ EXRAX BIC #BIT9,FLAG J%52 PAT11: 177737 PAT12: 004102 PAT13: 136363 PAT14: 063636 PAT15: 000001 PAT16: 100005 PAT17: 000520 PAT20: 030303 ;PAT21 RANDOM DATA ; ; ; ;DATA COMPARISON ROUTINE ;IF AN ERROR OCCURS BETWEEN THE OUT-BUFFER AND ;THE IN-BUFFER AN ERROR WILL BE REPORTED IN THE ;FOLLOWING MANNER ;DATA ERROR XX DAE XXXXXX DAR XXXXXX GOOD DATA XXXXXX BAD DATA ; ; COMPARE:CLR WORK2 ;WORD COUNT MOV #OUTBUF,SAVE ;SET UP OUTBUFFER POINTER MOV #INBUF,SAV1 ;SET UP IN BUFFER POINTER WRDCMP: CMP @SAVE,@SAV1& R0 ; SET UP JSR PC,SETREG ; REGISTERS HALT START: RESET ;CLEAR THE WORLD MOV #1000,%6 ;SET UP STACK MOV #340,@CSR ;LOCK UP INTERRUPT LEVELS CLR FLAG ;CLEAR PROGRAM FLAG CLR TRACK ;CLEAR TRACK REGISTERS CLR DMA ;CLEAR DAR REGISTERS CLR PATNU ;CLEAR PATTER COUNT MOV #1000,SWRDCT ;SET UP STANDARD WORD COUNT MOV SWRDCT,WRDCT TST @SR BMI CONM ;OPERATE UNDER PROGRAM CONTROL BIS #70000,FLAG JMP ADTST ;ENTER OPERATOR CONVERSATION M'ITY ASL R2 ; GET WORD INDEX MOV BSZTAB-2(R2),R4 ; GET MAX ALLOWED # OF PAGES WITH DYNAMIC BIT MOV R4,R5 ; SAVE DYNAMIC BIT BIC #100000,R4 ; LEAVE ONLY # OF PAGES MOV #103,R3 ; SET ERROR CODE CMP TXTBK1+22,R4 ; PROGRAM SIZE :: MAX ALLOWED BGT RLKER ; ERROR BRANCH TST R5 ; IS THIS PRIORITY "DYNAMIC"? BMI RLED5 MOV (SR %5,CONV DMA MES1 6 JSR %5,CONV TRACK MES1A 2 JSR %5,CONV WRDCT MES3 4 EMT+0 HED6 MES1A MES1 MES3 -1 EXRAX: INC PASSC ;HAVE WE DONE IT 1000 TIMES BNE WRLG ;BRANCH IF NO BIT #BIT11,@SR ;LOOP ON TEST BEQ .+6 ;BRANCH IF YES JMP RANEX ; ;CHECK FOR MULTI DISK MODE ;IF IN MULTI DISK MODE REPORT "END" ;IF LAST DISK ON SYSTEM HAS BEEN ;EXERCISED. ; ; CLR DMA CLR TRACK BIT #BIT11,FLAG ;ARE WE IN MULTI DISK MODE BEQ REPOEN ;REPORT "END" MOV FLAG,WOR) ;COMPARE BUFFERS BNE WDERR ;WORD IN ERROR WRDINC: INC WORK2 ;+1 WORD COUNT CMP WRDCT,WORK2 ;IS COMPLETE BUFFER CHECKED BEQ ADAM ;EXIT ROUTINE ADD #2,SAVE ADD #2,SAV1 BR WRDCMP ;COMPARE NEXT WORD ADAM: RTS %5 ;EXIT THIS ROUTINE ; WDERR: BIS #BIT9,FLAG ;SET ERROR BIT MOV DMA,WORK ;FETCH STARTING DISK ADDR MOV TRACK,WORK1 ; ADD WORK2,WORK ;CALCULATE FAILING ADDR 1$: BIT #177700,WORK BEQ 2$ INC WORK1 SUB #100,WORK BR 1$ 2$: *ODE CONM: EMT +1 ;ASK ABOUT DATA TEST ONLY CON1 JSR %7,ALPHA ;GO WAIT FOR ANSWER CMP #153,TEXBUF ;TEST FOR YES BNE 2$ ; BRANCH IF NOT YES BIS #BIT10,FLAG BR 4$ 2$: CMP #67,TEXBUF ; TEST FOR NO BNE CONM ; TRY AGAIN IF NEITHER YES OR NO 4$: EMT +1 CON2 ;ASK ABOUT MULTI DISK MODE JSR %7,ALPHA ;GO WAIT FOR ANSWER CMP #153,TEXBUF ;TEST FOR YES BEQ 3$ CMP #NO,TEXBUF ; NO - R4,TXTBK1+22 ; REPLACE WITH MAX SIZE FOR FIXED PARTITION RLED5: MOV FILID,R5 ; LOAD FILE I.D. MOV #104,R3 ; LOAD ERROR CODE FOR ILLEGAL FILE I.D. CMP R5,#NDISCS+$SYSFL ; MUST BE GREATER THAN SYSTEM RESERVED BLE RLKER ; ERROR EXIT CMP R5,#MAXID1 ; I.S. MUST BE <= MAXIMUM ALLOWED BGT RLKER ; ERROR EXIT MOV R5,DFLIST+6 ; LOAD FILE I.D. INTO LIST ; ******* ,K ;WHAT DISK ARE WE ON BIC #177743,WORK ;IF LAST DISK ON SYSTEM CMP WORK,DSKNOR ;REPORT END BEQ REPOEN ;REPORT "END" LAST DISK ADD #4,FLAG ;INC. DISK NO. BR EXTPP ;EXERCISE DISK REPOEN: EMT +1 END ;REPORT END OF PASS BIC #34,FLAG EXTPP: JMP ADTST ;RECYCLE ; ;ENTER DISK HANDLER BY THE TRAP INSTRUCTION ;ARGUMENT TO TRAP INSTRUCTION IS TWO ORDER ;BYTE OF THE CONTROL REGISTER. ; DISK: MOV DBR,%5 ;SET UP TO LOAD DISK REG MOV TRACK,-(5) ;LOAD TRACK NUMBER MOV FLAG,WORK ;SET UP D-MOV FLAG,WORK3 BIC #177743,WORK3 SWAB WORK3 BIS WORK3,WORK1 JSR %5,CONV ;CONVERT WORD ADDR TO ASCII WORK MES1 6 JSR %5,CONV ;CONVERT TRACK ADDR TO ASCII WORK1 MES1A 2 MOV @SAVE,WORK ;FETCH GOOD DATA JSR %5,CONV ;CONVERT GOOD DATA TO ASCII WORK MES5 6 MOV @SAV1,WORK ;FETCH BAD DATA JSR %5,CONV ;CONVERT TO ASCII WORK MES6 6 MOV FLAG,WORK ;WHICH READ THE BIC #177774,WORK ;ERROR OCCURRED ON JSR %5,CONV WORK MES13 1 EMT +0 ;PRINT MESSAG/ BEQ DATTES ; DO NOT ENTER STATIC TEST BR 4$ 3$: BIS #BIT11,FLAG ;SET FLAG TO ENTER STATIC TEST DSKDR: EMT +1 CON3 JSR %7,NOCHA SUB #1,TEXBUF CMP #10,TEXBUF BLOS DSKDR MOV TEXBUF,DSKNOR ROL DSKNOR ROL DSKNOR ; DSKNOR CONTAINS NUMBER OF DISKS - 1 TIMES 4 BR ASKWC DATTES: EMT +1 CON4 ;ASK UNIT NUMBER JSR %7,NOCHA ;WAIT FOR NO. CMP #10,TEXBUF ;IS NO = O>10 BLOS DATTES ;NO CLC ROL TEXBUF ROL TEXBUF ; PLACE DISK NUMBER IN FLAG 06S0$P0!0000&106IPPR D OR.W 05S0$P0!0000&105IPPR D OR.W 04S0$P0!0000&104IPPR D OR.W 03S0$P0!0000&103IPPR D OR.W 02S0$P0!0000&102IPPR D OR.W 01S0$P0!0000&101IPPR D OR.W Y.OREM MTOIND DEOA LRE AEYTH ; EREVENWHE IZ SUMIMAX MHE TSTUEEQ RSTMUY HE TND AE,IZ SIND XEFI ; RE ANSIOITRTPAR EITH E.ICSLE-IM TOR NEDIX FOT N.,.E IC,MINADY ; ISY ITORRI PHE TIFT SES IIT BGNSIE TH Y.ITORRI PCHEAR FO ; S ZESI" GEPA "ORK OCBLE BLWALO0ISK NO. BIC #177743,WORK ;MASK FORM PROGRAM FLAG BIS WORK,(5) ;LOAD UNIT INTO DAE MOV DMA,-(5) ;LOAD WORD ADDRESS MOV BUF,-(5) ;SET UP CURRENT ADDRESS MOV WRDCT,-(5) ;LOAD WORD COUNT COM (5) ;SET UP TWO'S COMPLEMENT INC (5) MOV (6),%4 MOV -(4),WORK ; BIC #177600,WORK ;MASK FUNCTION BITS MOV WORK,-(5) ;LOAD FUNCTION REG. RTI ;RETURN FROM TRAP ; ; ; ; ; ; ; ;RF11 DISK INTERRUPT HANDLER ;ROUTINE CONTINUES ON ERRORS ; DKINT: BIC #BIT4,@CSR ;CLEAR TRACE BIT TST @DCS ;TE1E HED1 MES13 MES1A MES1 MES5 MES6 -1 BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT 10 SET IN SR BR WRDINC ;GO COMPARE NEXT WORD ; ; ; ; ; ; ;ROUTINE TO ZERO DATA INPUT BUFFER ;ZERO BUFFER BEFORE READING ; ZOBUF: MOV #OUTBUF,R4 ; ZERO OUTPUT BUFFER BR ZBUFE ; ZBUF: MOV #INBUF,%4 ;FETCH START OF INBUFFER ZBUFE: MOV #4000,R0 1$: CLR (R4)+ SOB R0,1$ RTS %5 ;EXIT ROUTINE ; ; ; ; ;ROUTINE TO TE2 .PAGE ; ; ; ; MACRO DEF. FOR QUEUES ; .MACRO .QUE A,B,C .BOUND .LIST ME A = .-4 B = .-2 .REPT C .WORD 0 .IFZ $KT11C .WORD .-2 ; NOTE: PPA WHEN RESOLVED BY IPL .ENDC .IFNZ $KT11C .PACK .-2 .ENDC .ENDR .NLIST ME .ENDM ; ; MACRO TO SET PRIORITY LEVEL 7 ; .MACRO .LOCK PSR =3BIS TEXBUF,FLAG ASKWC: EMT +1 CON5 ;ASK ABOUT OPTIONAL WORD COUNT JSR %7,ALPHA ;WAIT FOR ANSWER CMP #153,TEXBUF BEQ WCCON ; BR IF YES CMP #NO,TEXBUF ; TEST FOR NO BEQ OPDAR ; ASK ABOUT OPTIONAL DAR BR ASKWC ; ASK AGAIN WCCON: EMT +1 CON6 ;ASK LENGTH OF WC JSR PC,NOCHA BIC #3,TEXBUF ; MAKE A MULTIPLE OF 4 TST TEXBUF BEQ WCCON CMP #1001,TEXBUF ;IS WORD COUNT>1000 B4ST FOR ERROR BPL INTEXT ;BRANCH IF NO ERROR BIS #BIT9,FLAG ;SET ERROR BIT MOV @DAE,WORK ;REPORT ERROR BIC #177700,WORK ;MASK ADDRESS EXT. BITS. JSR %5,CONV ;CONVERT TO ASCII WORK MES1A 2 EMT+1 HED2 MOV @DCS,WORK ;TEST FOR READ BIC #177770,WORK CMP #4,WORK BNE DELMES ;IF READING REPORT WHICH READ MOV FLAG,WORK BIC #177774,WORK JSR %5,CONV WORK MES13 1 EMT+1 MES13 DELMES: MOV @DAR,WORK ;SET UP LOWER 16 BITS OF ADDR. DEC WORK JSR %5,CONV ;CONVERT TO ASC5ST FOR ADDITIONAL DATA TRANSFERS ;ANY DATA TRANSFERRED AFTER WORD COUNT OVERFLOW IS AN ERROR ; ; OVRFLO: MOV WRDCT,%4 ;ADD WORD COUNT ROL %4 ADD #INBUF,%4 CHWRD: CMP R4,#INBUF+10000 ; IS TEST COMPLETE BNE CKNEX ;CHECK NEXT WORD RTS %5 ;TEST IS COMPLETE CKNEX: TST (4)+ ;TEST FOR ZERO WORD BEQ CHWRD ;WORD IS ZERO BIS #BIT9,FLAG ;SET ERROR BIT MOV %4,ACNVX SUB #2,ACNVX JSR %5,CONV ;CONVERT 1 OCTAL TO ASCII ACNVX ;ADDRESS MES4 6 MOV %4,ACNVX SUB #2,ACNVX MOV @AC 177776 .IFZ $1145 MOVB #340,@#PSR .ENDC .IFNZ $1145 SPL 7 .ENDC ; ; SET INTERRUPT LOCKOUT .ENDM ; 7LOS WCCON ;YES ASK FOR COUNT AGAIN MOV TEXBUF,SWRDCT ;OPERATING WORD COUNT MOV SWRDCT,WRDCT ; OPTIONAL SECTOR ADDRESS **************** OPDAR: EMT +1 CON7 ;ASK ABOUT OPTIONAL DAR JSR %7,NOCHA CMP #100,TEXBUF ; 77 MAX SECTOR NUMBER BLOS OPDAR MOV TEXBUF, DMA ;TEMP DAR REGISTER OPPAT: EMT +1 CON8 ;ASK ABOUT DATA PATTERNS JSR %7,NOCHA CMP #23,TEXBUF ;TEST FOR CORRECT NO BLOS OPPAT ;ASK AGAIN CMP #22,TEXBUF BEQ OPWRT ;DATA PATTERN UNDER PROGRAM CONTROL 8II WORK MES1 6 EMT+0 MES1A MES1 -1 MOV @DCS,WORK ;SET UP STATUS JSR %5,CONV WORK MES2 6 EMT+1 MES2 BIT #BIT14,@DCS ;TEST FOR HARD ERROR BEQ SOFTER ;GO AND CONTINUE SOFT ERROR MOV @DAE,WORK ;FETCH ERROR EXT. BITS SWAB WORK BIC #177400,WORK JSR %5,CONV ;CONVERT TO ASCII WORK MES2A 3 EMT+0 HED5A MES2A -1 BIS #BIT8,@DCS ;CLEAR THE DISK MOV #1000,%6 BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT 10 SET IN SR JMP @HRDER ;EXIT HAR9NVX,ACNVX JSR %5,CONV ;CONVERT OCTAL TO ASCII ACNVX ;DATA MES6 6 EMT +0 ;CALL TYPE OUT ROUTINE HED3 MES4 MES6 -1 BR CHWRD ;FETCH NEXT WORD ; ; ;EXTENDED MEMORY EXERCISER ;THE PROGRAM DETERMINES HOW MUCH MEMORY ;IS ON THE SYSTEM THEN IT ;GENERATES A RANDOM BUFFER THAT SIZE ;AND WRITES AND WRITE CHECKS THE DATA ; EXTMEN: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PRIORITY LEVELS MOV #1000,%6 MOV #MAXREF,4 ;SET UP I/O BUS TRAP MOV #340,6 MOV #17446,SA: ;NO: BEGIN @ BEGINNING OF SYMBOL TABLE BR PTGL02 PTGL01: MOV PTROBJ,R0 ;CURRENT OBJ MOD PTGL02: CMP R0,USYME ;END? BLO PTGL03 ;NOT YET 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 ; BIS #BIT15,FLAG ;SET PROGRAM FLAG MOV TEXBUF, PATNU ;OPERATOR WANTS TO SELECT DATA CLC ROL PATNU BIC #70000,FLAG ;CLEAR OP MODE BITS IN FLAG OPWRT: EMT +1 CON9 ;ASK ABOUT WRITE JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES BEQ $5 ; BR IF YES CMP #NO,TEXBUF ; TEST FOR NO BEQ OPWCK ; GO ASK ABOUT WRITE CHECK BR OPWRT ; ASK AGAIN $5: BIS #BIT14,FLAG ;YES SET FLAG BIT OPWCK: EMT +1 CON10 ;ASK <D ERROR SOFTER: TST @WC ;CHECK FOR X-FER DONE BEQ INTEXT ;EXIT FROM ROUTINE BIT #BIT9,@SR BEQ .+6 SUB #2,(6) ;X-FER NOT DONE SET UP FOR RETURN BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT10 SET IN SR BIS #BIT0,@DCS ;SET GO AND CONTINUE RTI ;RETURN TO WAIT INSTR. ; ; INTEXT: BIT #BIT13,@SR ;HALT ON COMPLETION FLAG BEQ .+4 HALT ;YES BIT 13 SET IN SR HALT BIT #BIT9,@SR BNE .+6 MOV #774,%6 ;RESET STACK RTI ;EXIT ; ; ; ; ;ROUTINE TO SET UP DAR A=VE ;SET UP FOR 4K EXREF: TST @SAVE ;REFERENCE MEMORY CMP #177446,SAVE ;TEST FOR GREATER THAN 28K BNE .+6 ;BRANCH IF LESS THAN 32K HALT BR MAXREF ;LAST REFERENCE MADE TO I/O REG. ADD #20000,SAVE ;SET UP FOR NEXT MEMORY REF. BR EXREF ;GO REFERENCE MEMORY ; ;ENTER HERE WHEN I/O BUS ERROR OCCURS ; MAXREF: MOV #6,4 ;RESTORE I/O BUS TRAP CLR 6 MOV #1000,%6 SUB #20000,SAVE ; SUB #OUTBUF,SAVE ;SET UP NEW WORD COUNT MOV SAVE,SWRDCT ROR SWRDCT MOV SWRDCT,WRDCT MOV #BIT7,@CSR ;S>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/RELOC FLAG MOV R0,ABSVAL ;=0: ABSOLUTE; ELSE RELOCATABLE MOV (SP)+,R0 ;UNSAVE ADD #2,(SP) ;"GOOD" RETURN RTS PC ;NO MATCH PTGL04: ADD #BPSYM,R0 ;NEXT LSD ENTRY BR PTGL02 ;TRY AGAIN ?ABOUT WRITE CHECK JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES ANSWER BEQ $6 ; BR IF YES CMP #NO,TEXBUF ; TEST FOR NO BEQ OPRD ; GO ASK ABOUT READ BR OPWCK ; ASK AGAIN $6: BIS #BIT13,FLAG ;YES SET FLAG BIT OPRD: EMT +1 CON11 ;ASK ABOUT READ JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES ANSWER BEQ $7 ; BR IF YES CMP #NO,TEXBUF ; TEST FOR NO BEQ @ND DAE ;FROM SR AND CONVERSATION ;ENTER FROM JSR %5,OPDSEL OPDSEL: BIT #BIT7,@SR ;DOES SR CONTAIN TRACK # BNE .+4 RTS %5 MOV @SR,WORK ;FETCH SR ROR WORK ROR WORK ROR WORK ROR WORK ROR WORK BIC #177774,WORK ;MASK AIGL ORDER 2 BITS MOV WORK,TRACK MOV @SR,WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK BIC #003777,WORK BIC #174000,DMA ADD WORK,DMA ;SET UP LOWER 16 BITS OF ADDRESS RTS %5 ;EXIT ;AET UP PRIORITY LEVEL MOV #NEWBUF,HRDER ;SET UP FOR HARD ERROR CLR DMA CLR TRACK NEWBUF: MOV WRDCT,WORK ;SET UP FOR RANDOM BUFFER MOV #OUTBUF,%1 JSR %5,RANDOM ;NEW DATA BUFFER GENERATED MOV #OUTBUF,BUF WRITE+100 ;WRITE BUFFER BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK+100 ;WRITE CHECK DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR NEWBUF ;GO WRITE NEW BUFFER BR NEWBUF-10 ;DISK COMB.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 ; 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 C CHKFLG BR OPRD ; ASK AGAIN $7: BIS #BIT12,FLAG ;SET FLAG TO READ CHKFLG: BIT #70000,FLAG BEQ OPWRT ; GO BACK AND ASK AGAIN IF ALL NO ; ; ; ADTST: BIT #BIT11,FLAG ;ARE WE IN MULTI DISK MODE BEQ EXMFLG ;BRANCH IF NO. EMT +1 MES11 MOV FLAG,ACNVX ROR ACNVX ROR ACNVX MOV ACNVX,R0 ; SET UP DEVICE PAGE REGISTERS JSR PC,SETREG JSR %5,CONV ACNVX MES12 1 EMT +1 MES12 EXMFLG: BIT #BIT10,FLAG ;TESD ;ROUTINE TO SETUP DISK BUFFERS ;ADD WORD COUNT TO STARTING DISK ADDRESSES ;COMPARE CALCULATED ADDRESS TO TERMINATING ADDRESS ; DISBUF: ADD WRDCT,DMA ;ADD WORD COUNT TO LOWER 16 BITS BCC COMDAR INC TRACK ;OVERFLOW ADD ONE TO TRACK COMDAR: CMP DMA,@DAR ;COMPARE LOWER 16 BITS BEQ CMDAE BIS #BIT6,FLAG ; CMDAE: MOV @DAE,WORK1 ;FETCH EXT. ADDR BITS BIC #177740,WORK1 ;MASK TRACK AND DISK ADDR MOV FLAG,WORK ;SET UP DISK ADDRESS BIC #177743,WORK ADD TRACK,WORK BIC #177740,WORK CMP WOREPLETE START AGAIN ; ;BACKGROUND TEST FOR INTERRUPTS ; XWAIT: MOV #RTIX,14 ;SET UP TRACE TRAP CLR 16 MOV #-1000,PASS ;SET UP TIME BASE BIS #BIT4,@CSR ;SET TRACE BIT CLR #0 XINCW: INC XINCW-2 TSTB XINCW-2 BPL XINCW INC PASS BEQ XINERR JSR PC,BCKGRD BR XINCW-4 ;REPORT BACKGROUND TEST TIMED OUT XINERR: MOV #340,@CSR BIC #BIT4,@CSR ;CLEAR TRACE BIT EMT+1 TIMO NOP ; PATCH TO A HALT IF DESIRED ; RTIX: RTI ; RDCS: .WF #2,(SP) ;"GOOD" RETURN RTS PC ; ******************************************************************** SRGLOB: ;SEARCH LSD FOR A GLOBAL & RETURN ITS FINAL VALUE 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 ; **********************************GT FOR DATA TEST ONLY BEQ ADT2 ; DO COMPLETE TEST JMP DATAT ;DO DATA TEST ONLY TSTBF: .REPT 40 .WORD -1,-1 .ENDR ;***ADDRESS ADT2*** ; ;IN THIS TEST WRITE TRACK ZERO WITH ZERO'S ;THEN WRITE ALL ONES IN AN ADDRESS ;CHECK IF WRITING ONES IN THAT ADDRESS ALTERED ;ANY OTHER ADDRESS IN THE TRACK ;FOLLOW THIS PROCEDURE FOR ADDRESS (SECTORS) 1 TO 77 ; ; ADT2: MOV #1000,%6 ;SET UP STACK MOV #4000,WRDCT ; SET UP WORD COUNT HK,WORK1 ;ARE THEY EQUAL BNE ERADR ;ERROR IN DAE REG TSTB FLAG ;CHECK FOR LAST DISK BUFFER BPL EXTCME CLR DMA ;CLEAR LOWER 16 BITS CLR TRACK ;CLEAR EXT. ADDR. BITS. BIC #200,FLAG ADD #2,(6) ;INC STOCK POINTER MOV SWRDCT,WRDCT BR EXTDR ;EXIT EXTCME: BIC #177774,WORK1 ;MASK EXT. TRACK BITS CMP #3,WORK1 ;COMPARE FOR LAST TRACK BNE AKH ;NOT LAST TRACK EXIT MOV @DAR,WORK ;FETCH LOWER 16 BITS OF ADDRESS ADD WRDCT,WORK ;WILL DISK OVERFLOW BCC AKH BIS #200,FLAG MOV @DAR,WRDCIORD 0 ; STATUS RWC: .WORD 0 ; WORD COUNT RCMA: .WORD 0 ; CURRENT MEMORY ADDRESS RDAR: .WORD 0 ; DISK ADDRESS RDAE: .WORD 0 ; DISK ADDRESS EXTENSION .WORD 0,0,0 MTS = 172520 MTC = MTS + 2 MTBRC = MTS + 4 MTCMA = MTS + 6 ; BCKGRD: MOV R1,SAVR1 ; SAVE R1 TSTB @RDCS BEQ DATUM MOV #400,@RDCS ; CLEAR MOV #-3600,@RWC J********************************** INUSYM: ;INSERT AN ENTRY IN UNDEFINED SECTION OF LSD ; INPUT: R4 POINTING TO ".REF" ENTRY IN GSD MOV R0,-(SP) ;SAVE IT 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 ;OK MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV PATNU,SAVE CLR PATNU CLR TRACK CLR DMA JSR %5,PASEL ;SET UP DATA BUFFER MOV SAVE,PATNU ; ZERO SECTORS 0 TO 37 RFADT: BIS #BIT8,@DCS WRITE 3$: TSTB @DCS ; TEST FOR READY BPL 3$ TST @DCS ;TEST FOR ERROR BPL RFADTY MOV #1,ERCOUNT ;ERROR OCCURRED MOV @DCS,WORK1 ;FETCH DCS REGISTER MOV @DAR,WORK DEC WORK ER1: JSR %5,STAER1 ;REPORT ERROR OCURRED ;****WRD1=CONTROL STATUS REG. AT THE THE TIME LT ;DISK WILL OVERFLOW COM WRDCT ;SET UP NEW WORD COUNT INC WRDCT ;MAKE TWO'S COMP. AKH: MOV @DAE,TRACK BIC #177774,TRACK ;MASK TRACK BITS MOV @DAR,DMA ;LOWER 16 BITS OF ADDRESS BIT #BIT6,FLAG ;REPORT ADDRESS ERROR BNE .+4 EXTDR: RTS %7 ;EXIT ERADR: JSR %5,CONV ;CONVERT DMA REG COUNT TO ASCII DMA MES1 6 JSR %5,CONV ;CONVERT TRACK REG COUNT TO ASCII WORK1 MES1A 2 EMT +0 ;REPORT ERROR HED4 MES1A MES1 -1 BIC #BIT6,FLAG CLR DMA ;DISK ADDRESS ERROR RE-START PROGM ; SET WORD COUNT MOV #RFBUF,@RCMA ; SET ADDRESS INC DFADD ; SET DISK ADDRESS MOV DFADD,R1 MOV R1,@RDAR ; SET DISK ADDRESS MOV #5,@RDCS ; READ COMMAND MOV SAVR1,R1 DATUM: CLR MTC BIT #1,@#MTS ; TAPE UNIT READY 1$: BNE 2$ RTS PC 2$: BIT #2000,@#MTS BEQ 3$ MOV #240,1$ RTS PC 3$: MON.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 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? OOF THE ERROR **** ;****WRD2=DISK ADDR. AT THE TIME OF THE ERROR **** BR RFADT ;LOOP ON ERROR RFADTY: MOV #40,DMA ; ZERO SECTORS 40 TO 77 RFADTX: BIS #BIT8,@DCS ;CLEAR THE DISK WRITE $4: TSTB @DCS BPL $4 TST @DCS ;TEST FOR ERROR BPL RFRC MOV @DAR,WORK DEC WORK MOV @DCS,WORK1 ;FETCH DCS REGISTER MOV #2,ERCOUNT ;SETUP ERROR COUNT ER2: JSR %5,STAER1 ;REPORT DISK ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****P. CLR TRACK BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;SWITCH 10 SET IN SR HALT RTS %7 ; ; ; ; ; ; ;ROUTINE TO SELECT DATA PATTERNS FOR TEST ; ;ENTER FROM JSR %5 PASEL ; PASEL: MOV PATNU,%0 ;SET UP PATTERN NUMBER MOV WRDCT,WORK ;SET UP WORK MOV #OUTBUF,%1 ;LOC. OF OUTBUFFER CMP #42,%0 ;TEST FOR RANDOM DATA NUMBER BEQ RANDOM ;GO GENERATE RANDOM DATA FILDAT: MOV PAT0(0),(1)+ ;FILL BUFFER DEC WORK ;DEC. WORK COUNT TST WORK ;TEST FOR LAST WORK BNE FILDAT ;LOAD NEQV #1000,@#MTC ; CLEAR MOV @#OUTBUF,@#MTCMA ; SET BUFFER ADDRESS MOV #-1000,@#MTBRC ; SET BYTE COUNT MOV #5,@#MTC ; GIVE WRITE COMMAND RTS PC DFADD: .WORD 0 ; DISK ADDRESS SAVR1: .WORD 0 .PAGE ;RF11 POWER FAIL TEST "1 ; DISK ZERO ; WRITE COMPLETE DISK WITH 125252 PATTERN ; REPORT "OK" ;START WRITING THE SAME PATTERN ;WHEN POWER FAIL OCCURS ABORT TRANSFER ;SETUP NEW ENTRY POINT AND HALT ;R JSR R5,REGPOP ;RESTORE RTS PC ; ******************************************************************** LDER22: MOV #22,R4 ;GLOBAL SYMBOL SEARCH 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 SSWRD2=DISK ADDR. REG AT THE TIME OF THE ERROR **** BR RFADTX ;LOOP ON ERROR RFRC: CLR SAV1 RFRD: CLR SAVE WONWD: MOV #TSTBF,BUF MOV #100,WRDCT MOV SAV1,DMA BIS #BIT8,@DCS WRITE TSTB @DCS ;TEST FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL SUADB ;BRANCH IF NO CONTROL ERROR MOV @DCS,WORK1 MOV SAV1,WORK MOV #3,ERCOUNT ;SETUP ERROR COUNT ER3: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=DISK CONTROL STATUS AT THE TIME OF THE ERROR**** ;****WRD2=DISK ADDTXT WORD RTS %5 ;BUFFER FULL ; ;RANDOM DATA ; ; ; ; ;RANDOM DATA GENERATOR SUBROUTINE RANDOM: MOV LONUM,%0 ;SET UP R0 WITH 5 DIGITS LOW MOV HINUM,%4 ;SET UP R1 WITH 5 DIGITS HIGH MOV #7,%3 ;SET UP SHIFT COUNT CLR %2 ;CLEAR R2 SHIFT: ASL %0 ;SHIFT R0 LEFT AND ROL %4 ;ROTATE CARRY INTO LSB OF R1 INTO ROL %2 ;ROTATE CARRY OUT OF R1 INTO R2 DEC %3 ;DECREMENT R3 BNE SHIFT ;CONTINUE SHIFT LOOP ADD LONUM,%0 ;ADDN IN NUMBER TO MAKE X 129 ADC %4 ;PROPOGATE CARRY ADD HINUM,%4 U ;POWER UP AND WRITE CHECK THE DISK FOR ERRORS ; ;***ONLY ONE ERROR IS CONSIDERED ACCEPTABLE*** ; ; PFT1: MOV #1000,%6 ;SET UP STACK JSR %7,POWFAL ;WRITE 125252 ON DISK PFWAT: BIS #BIT8,@DCS ;CLEAR DISK CLR DMA CLR TRACK MOV #PFWAT,HRDER ;SET UP FOR HARD ERROR MOV #DOWN,24 ;SET UP POWER FAIL VEC. MOV #340,26 MYBYWR: WRITE +100 BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR MYBYWR BR PFWAT ;ROUTINE TO CHECK DATA AFTERVECTION INPT01: ADD #BPSYM,R4 ;NEXT (POSSIBLE) SECTION ENTRY ;[SKIP FIRST ONE: IT IS SECTION'S NAME]. CMP R4,SYME ;DID WE REACH 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 (RWR. IN ERROR WHEN TRYING TO WRITE ALL ONES **** BR WONWD ;RE-WRITE WORD SUADB: MOV SAV1,R0 ; COMPUTE BUFFER ADDRESS OF -1 BLOCK ASH #7,R0 ADD #OUTBUF,R0 MOV R0,WORK4 ; SAVE FOR CLEAN UP MOV #100,R1 2$: MOV #-1,(R0)+ SOB R1,2$ WRCADT: BIS #BIT8,@DCS MOV #10000,WRDCT ; SET UP WORD COUNT MOV #OUTBUF,BUF ;SETUP CURRENT ADDR MOV SAVE,DMA ;SETUP DISK ADDRESS WRCHECK TSTB @DCS X;ADDN IN NUMBER TO MAKE X 129 ADC %2 ;PROPOGATE CARRY ADD #1057,%0 ;ADDN LOW CONSTANT ADC %4 ;PROPOGATE CARRIES ADC %2 ;PROPOGATE AGAN ADD #47401,%4 ;ADDN HIGH CONSTANT ADC %2 ;PROPOGATE CARRY ADD #6,%2 ;ADDN HIGHEST CONSTANT ADD %2,%0 ;REPRIME R0 WITH HIGH DIGIT ADC %4 ;PROPOGATE CARRY MOV %0,LONUM ;PUT R0 BACK IN LONUM MOV %0,(1)+ ;HOLD LONUM FOR PROGRAM DEC WORK BEQ EXGEN MOV %4,HINUM ;PUT R1 BACK IN HINUM MOV %4,(1)+ ;HOLD HINUM FOR PROGRAM DEC WORK BNE RANY POWER FAIL ; UPCHK: BIS #BIT8,@DCS ;CLEAR THE DISK CLR DMA CLR TRACK MOV #UPCHK,HRDER ;SET UP FOR HARD ERROR CHKDAT: WRCHECK +100 BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR CHKDAT JMP PFWAT ;GO WAIT FOR ANOTHER ;POWER FAIL ; ;POWER DOWN ROUTINE ;ABORT DISK AND HALT ; ; DOWN: BIS #BIT8,@DCS ;ABORT DISK MOV #UP,24 ;SET POWER FAIL VECTOR HALT ; UP: MOV #DOWN,24 MOV #1000,%6 MOV #-300.,WORK ;SET UP TWEZ4),(R2) ;FIRST HALF-WORDS: BHI INPT02 ;NEW ONE IS LATER ALPHATETICALLY: BLO INPT01 ;NEW ONE IS EARLIER: KEEP LOOKING CMP 2(R4),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 OTH[;CHECK FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL CHKBUF ;BRANCH NO DISK ERROR MOV @DCS,WORK1 MOV SAV1,WORK DEC WORK MOV #4,ERCOUNT ;SET UP ERCOUNT ER4: JSR %5,STAER1 ;REPORT ERROR MOV @DAR,ACNVX ;SET UP DISK ADDR. FOR REPORT JSR %5,CONV ACNVX MES4 6 EMT +1 MES4 ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. IN ERROR DURING WRITE CHECK **** ;****WRD ADDR.=ADDR. WHICH CONTAINS ALL ONES **** BR WRCADT ; CHKBUF: MOV \DOM EXGEN: RTS %5 ;RETURN T PROGRAM LONUM: 0 HINUM: 0 ; ; ; ; ; ; ; .EVEN ; ;RF11 DATA PATTERNS ; PAT0: 0 PAT1: 177777 PAT2: 134510 PAT3: 043267 PAT4: 100000 PAT5: 107070 PAT6: 070707 PAT7: 052525 PAT10: 125252 PAT11: 177737 PAT12: 004102 PAT13: 136363 PAT14: 063636 PAT15: 000001 PAT16: 100005 PAT17: 000520 PAT20: 030303 ;PAT21 RANDOM DATA ; ; ; ;DATA COMPARISON ROUTINE ;IF AN ERROR OCCURS BETWEEN THE OUT-BUFFER AND ;THE IN-BUFFER AN ERROR WILL BE REPORTED IN THE]NTY SECOND TIMER TIMCNT: RESET INC WORK ;+1 TIMER BNE TIMCNT ;TWO SECONDS NOT UP GO WAIT JMP UPCHK ;GO CHECK DISK ; ; ; ; ; ; ;POWER FAIL TEST #2 ;DISK ZERO ;WRITE COMPLETE DISK WITH 125252 PATTERN ;REPORT "OK" ;WRITE CHECK DISK AND WAIT FOR POWER FAIL ;WHEN POWER COMES BACK WRITE CHECK DISK AGAIN ;AND CHECK FOR ERRORS ;***NO ERRORS SHOULD OCCUR.*** ; ;DO NOT CREATE ANOTHER POWER FAIL UNTIL ;THE ADDRESS REGISTER HAS COMPLETELY CYCLED ;THROUGH. ; PFT2: MOV #1000,%6 ;SET UP ST^ERS 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,-(SP) 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 _ WORK4,R0 ; CLEAR -1 BLOCK IN BUFFER MOV #100,R1 3$: CLR (R0)+ SOB R1,3$ ZEROAD: CLR SAVE ; MOV SAV1,DMA ;SETUP DISK ADDRESS MOV #OUTBUF,BUF MOV #100,WRDCT ; SET UP WORD COUNT WRITE TSTB @DCS ;CHECK FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL INDADT MOV #5,ERCOUNT MOV @DCS,WORK1 MOV @DAR,WORK ER5: JSR %5,STAER1 ;****WRD1=CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. AT THE T` ;FOLLOWING MANNER ;DATA ERROR XX DAE XXXXXX DAR XXXXXX GOOD DATA XXXXXX BAD DATA ; ; COMPARE:CLR WORK2 ;WORD COUNT MOV #OUTBUF,SAVE ;SET UP OUTBUFFER POINTER MOV #INBUF,SAV1 ;SET UP IN BUFFER POINTER WRDCMP: CMP @SAVE,@SAV1 ;COMPARE BUFFERS BNE WDERR ;WORD IN ERROR WRDINC: INC WORK2 ;+1 WORD COUNT CMP WRDCT,WORK2 ;IS COMPLETE BUFFER CHECKED BEQ ADAM ;EXIT ROUTINE ADD #2,SAVE ADD #2,SAV1 BR WRDCMP ;COMPARE NEXT WORD ADAM: RTS %5 ;EXIT THIS ROUTINE ; WDERR: BIS #BIT9,FLAGaACK JSR %7,POWFAL ;WRITE 125252 ON DISK PWRFL: CLR DMA CLR TRACK MOV #PWRFL,HRDER ;SET UP HARD ERROR MOV #PWRDN,24 ;SET UP POWER FAIL VEC. MOV #340,26 CHKDSK: WRCHECK +100 BIT #BIT9,@SR BNE .+6 IOT ;WAIT IN BACKGROUND BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;CHECK NEXT BUFFER BR CHKDSK BR PWRFL ; ;ROUTINE TO ABORT DISK DURING POWER FAIL ; PWRDN: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #PWRUP,24 ;SET UP RESTART HALT ; PWRUP: MOV #PWRDN,24 ;RESET POWER FAIL VECTOb #BPSYM,SYME ;BUMP BOTH POINTERS ADD #BPSYM,USYME RTS PC UNSQ02: MOV -(R0),-(R1) ;BLOCK MOVE MOV -(R0),-(R1) MOV -(R0),-(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 cIME OF THE ERROR **** BR ZEROAD ;LOOP ON ERROR INDADT: CMP #77,SAV1 BEQ LP2ADT ;LAST ADDR. CHECKED INC SAV1 JMP RFRD ;CHECK NEXT ADDRESS LP2ADT: BIT #BIT11,@SR ;IS BIT 11 SET IN SR BEQ ADT3 JMP ADT2 ;BIT 11 SET LOOP ON TEST .PAGE ;***** ADDRESS TEST ***** ; ;WRITE EACH UNIQUE ADDRESS ON ITSELF FOR TRACK 0 ;THEN READ IT BACK AND COMPARE FOR THE ;CORRECT DATA ; ; ADT3: CLR DMA ;CLEAR ACTIVE REG MOV #0,TRACK ; USE MOV RATHER THAN 'CLR' Fd ;SET ERROR BIT MOV DMA,WORK ;FETCH STARTING DISK ADDR MOV TRACK,WORK1 ; ADD WORK2,WORK ;CALCULATE FAILING ADDR BCC .+6 ;SHOULD DAE BE INCREMENTED INC WORK1 MOV FLAG,WORK3 BIC #177743,WORK3 BIS WORK3,WORK1 JSR %5,CONV ;CONVERT WORD ADDR TO ASCII WORK MES1 6 JSR %5,CONV ;CONVERT TRACK ADDR TO ASCII WORK1 MES1A 2 MOV @SAVE,WORK ;FETCH GOOD DATA JSR %5,CONV ;CONVERT GOOD DATA TO ASCII WORK MES5 6 MOV @SAV1,WORK ;FETCH BAD DATA JSR %5,CONV ;CONVERT TO ASCII eR MOV #1000,%6 MOV #-300.,WORK ;SET UP TWENTY SECOND TIMER XTIMCNT: RESET INC WORK ;+1 TIMER BNE XTIMCNT ;TWO SECONDS NOT UP GO WAIT BR PWRFL ;GO CHECK DISK ; ; ; ; ; ;ROUTINE TO WRITE THE COMPLETE DISK ;WITH 125252 PATTERN ;WRITE CHECK AND REPORT ERRORS IF THEY ;OCCUR ;REPORT "OK" AT COMPLETION POWFAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV (6),PASSC MOV #1000,%6 MOV #20,PATNU ;SET UP PATTERN CLR DMA CLR TRACK MOV #2000,SWRDCT ;SETUP WORD COUNT MOV SWRDCT,WRDCT JSR f ;ELEMENT SIZE ADD R1,R0 ;STAYS ONE ELEMENT ABOVE R1 ASR R1 ;USE BELOW AS COUNTER SQUI01: CMP R0,USYME ;REACHED TOP OF TABLE? 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 ;ADJgOR PATCHING IN TRAC CLR WORK CLR WORK1 MOV #1000,%6 ;SETUP STACK MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV #4000,WRDCT ; SET UP WORD COUNT MOV #OUTBUF,%0 ;FILL BUFFER WITH COUNT INADB: MOV WORK,(0)+ INC WORK ;+1 COUNT CMP #OUTBUF+10000,R0 BNE INADB ;SET UP NEXT WORD MOV WORK,SAVE WRABF: BIS #BIT8,@DCS ;CLEAR THE DISK WORLD WRITE ;WRITE TSTB @DCS ;IS THE CONTROL READY BPL .-4 ;CONTROL READY TST @DCS ;IS THERE AN ERROR BPL TFBL ;NO ERROR h WORK MES6 6 MOV FLAG,WORK ;WHICH READ THE BIC #177774,WORK ;ERROR OCCURRED ON JSR %5,CONV WORK MES13 1 EMT +0 ;PRINT MESSAGE HED1 MES13 MES1A MES1 MES5 MES6 -1 BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT 10 SET IN SR BR WRDINC ;GO COMPARE NEXT WORD ; ; ; ; ; ; ; ;ROUTINE TO ZERO DATA INPUT BUFFER ;ZERO BUFFER BEFORE READING ; ; ZBUF: MOV #INBUF,%4 ;FETCH START OF INBUFFER NZUF: CMP %4,#INBUF+2000 ;IS THE ROUTINE COMPLETE BNE CLEARi%5,PASEL ;GENERATE DATA BUFFER MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV #POWFAL,HRDER WRDNW: WRITE +100 BIT #BIT9,@SR ;CHECK ON HOW TO WAIT BNE .+6 IOT ;BACKGROUND TEST BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK +100 BIT #BIT9,@SR ; BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR WRDNW ;WRITE NEW BUFFER EMT +1 OK JMP @PASSC ;ROUTINE TO ALLOW THE OPERATOR TO SET BITS ;IN THE I/O REGISTERS VIA THE SWITCH REGISTER ; ;WORD CjUST POINTER TO BEGIN OF UNDEFINEDS RTS PC .PAGE NXTMOD: ;ROUTINE SETS UP PARAMETERS TO READ NEXT OBJ MODULE DEC NAMCTR ;MORE MODULES? 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 k MOV @DCS,WORK ;FETCH CONTENTS OF CONTROL REG MOV #6,ERCOUNT ;SET UP ERROR COUNT ER6: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR WRABF ;RE-WRITE DATA TFBL: MOV SAVE,WORK ADD #40,DMA CMP #10000,WORK BNE INADB-4 CLR WORK CLR WORK1 CLR DMA ADT3A: MOV #0,TRACK ; USE MOV RATHER THAN 'CLR' FOR PATCHING IN TRAC MOV #INBUF,BUF MOV #100,WRDCT RDTDN: BIS #BIT8,@l ;ZERO NEXT WORD RTS %5 ;EXIT ROUTINE CLEAR: CLR (4)+ ;CLEAR THE WORD BR NZUF ; ; ; ; ;ROUTINE TO TEST FOR ADDITIONAL DATA TRANSFERS ;ANY DATA TRANSFERRED AFTER WORD COUNT OVERFLOW IS AN ERROR ; ; OVRFLO: MOV WRDCT,%4 ;ADD WORD COUNT ROL %4 ADD #INBUF,%4 CHWRD: CMP %4,#INBUF+2000 ;IS TEST COMPLETE BNE CKNEX ;CHECK NEXT WORD RTS %5 ;TEST IS COMPLETE CKNEX: TST (4)+ ;TEST FOR ZERO WORD BEQ CHWRD ;WORD IS ZERO BIS #BIT9,FLAG ;SET ERROR BIT MOV %4,ACNVX SUB #2,ACNVX JSmOUNT REGISTER SELWC: MOV @SR,@WC ;MOV SR INTO WORD COUNT REG BR SELWC ; ;CURRENT ADDRESS REGISTER SELCMA: MOV @SR,@CMA ;MOV SR INTO CURRENT ADDR REG BR SELCMA ; ;DISK ADDRESS REGISTER SELDAR: MOV @SR,@DAR ;MOV SR INTO DISK ADDR REG BR SELDAR ; ;DISK ADDRESS EXT AND ERROR REGISTER SELDAE: MOV @SR,@DAE ;MOV SR INTO DISK ADDR EXT REG BR SELDAE ; ;DATA BUFFER REGISTER SELDBR: MOV @SR,@DBR ; MOV SR INTO DATA BUFFER BR SELDBR ; ; ;LOOK AHEAD REGISTER MOVLK: MOV @ADS,%0 ;MOVE LOOK An 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 NXTM30: RTS PC >*'*'''' ;"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 ; oDCS ;CLEAR THE DISK READ TSTB @DCS ;IS THE CONTROL READY BPL .-4 ;YES THE CONTROL IS READY TST @DCS ;IS THERE AN ERROR BPL ADRCMP ;NO ERROR MOV #7,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH CONTROL REG. ER7: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR RDTDN ;RE-READ ADRCMP: MOV #INBUF,R0 MOV DMA,R1 ASH #6,R1 MOV #100,R2 1$: CMP (R0)+,R1 BNE 2$ pR %5,CONV ;CONVERT 1 OCTAL TO ASCII ACNVX ;ADDRESS MES4 6 MOV %4,ACNVX SUB #2,ACNVX MOV @ACNVX,ACNVX JSR %5,CONV ;CONVERT OCTAL TO ASCII ACNVX ;DATA MES6 6 EMT +0 ;CALL TYPE OUT ROUTINE HED3 MES4 MES6 -1 BR CHWRD ;FETCH NEXT WORD ; ; ; ; ; ; ;EXTENDED MEMORY EXERCISER ;THE PROGRAM DETERMINES HOW MUCH MEMORY ;IS ON THE SYSTEM THEN IT ;GENERATES A RANDOM BUFFER THAT SIZE ;AND WRITES AND WRITE CHECKS THE DATA ; EXTMEN: BIS #BIT8,@DCS ;CLEAR THE DISK MqHEAD RESET RESET BR MOVLK ;INTO REGISTER 0 ; ; ;DISK CONTROL STATUS REGISTER SELDCS: MOV #340,@CSR ;LOCK UP INTERRUPTS MOV #177777,@WC ;SET WORD COUNT -1 WORD MOV #OUTBUF,@CMA ;SET UP CURRENT ADDRESS MOV @SR,@DCS ;MOV SR INTO CONTROL REG BIT #BIT0,@DCS ;IS FUNCTION BITS SET BEQ SELDCS ;FUNCTION BITS NOT SET DKBUSY: TSTB @DCS ;TEST FOR DISK NOT READY BPL DKBUSY ;DISK STILL READY BR SELDCS ;DISK NOT BUSY SELECT NEW CR ; ; ; ; ; ; ; ; ;THIS ROUTINE ENABLES THE OPERATOr 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 #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 SEs INC R1 SOB R2,1$ BR INCCMP 2$: MOV -(R0),WORK MOV R1,WORK1 MOV #10,ERCOUNT ;SET UP ERROR COUNT ER10: JSR %5,STAER1 ;REPORT COMPARISON ERROR ;****WRD1=DISK ADDR. WANTED **** ;****WRD2=DISK ADDR. RECEIVED **** INCCMP: INC DMA ; INC SECTOR NUMBER CMP #100,DMA ; LAST SECTOR BEQ LPADT3 BR RDTDN ;GO READ BUFFER LPADT3: BIT #BIT11,@SR ;LOOP ON TEST? BNE ADT3 ;YES BIT 11 SET IN SR .PAGE ;RF11 TtOV #340,@CSR ;LOCK UP PRIORITY LEVELS MOV #1000,%6 MOV #MAXREF,4 ;SET UP I/O BUS TRAP MOV #340,6 MOV #17446,SAVE ;SET UP FOR 4K EXREF: TST @SAVE ;REFERENCE MEMORY CMP #177446,SAVE ;TEST FOR GREATER THAN 28K BNE .+6 ;BRANCH IF LESS THAN 32K HALT BR MAXREF ;LAST REFERENCE MADE TO I/O REG. ADD #20000,SAVE ;SET UP FOR NEXT MEMORY REF. BR EXREF ;GO REFERENCE MEMORY ; ;ENTER HERE WHEN I/O BUS ERROR OCCURS ; MAXREF: MOV #6,4 ;RESTORE I/O BUS TRAP CLR 6 MOV #1000,%6 SUB #20000,uR TO SELECT A TRACK STATICLY ;THE ROUTINE DOES A ONE WORD READ TO SELECT THE TRACK ;THE OPERATOR MAY CHANGE THE SWITCH REGISTER AT ANY TIME ;SR6-0 EQUALS THE TRACK NUMBER ;SR9-7 EQUALS THE DISK NUMBER ; STAMP: BIS #BIT8,@DCS MOV @SR,WORK1 ;FETCH SR MOV WORK1,WORK BIC #176000,WORK ;MASK THE TRACK AND DISK NO. ROR WORK ROR WORK ROR WORK ROR WORK ROR WORK MOV WORK,@DAE ;DISK EXT. ADDR. REG. LOADED MOV @SR,WORK SWAB WORK ROL WORK ROL WORK ROL WORK BIC #3777,WORK MOV WORK,vCTORS 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 ;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 BLwRACK SELECTION TEST ; ;WRITE THE FIRST AND LAST ADDRESS OF EACH TRACK ;WITH THE OCTAL VALUE OF EACH TRACK ;BITS 6 THRU 11 EQUAL TRACK NUMBER ;BITS 0 THRU 5 EQUAL 0 IN FIRST SECTOR OF EACH TRACK ;BITS 0 THRU 5 EQUAL 77 IN LAST SECTOR OF EACH TRACK ; ;AFTER WRITING THE DISK READ EACH ADDRESS ;AND COMPARE DATA FOR THE CORRECT VALUE ; ADT4: CLR DMA ;CLEAR WORK REGISTERS CLR TRACK CLR OUTBUF CLR OUTBUF+2 CLR OUTBUF+4 CLR OUTBUF+6 MOV #1000,%6 ;SETUP xSAVE ; SUB #OUTBUF,SAVE ;SET UP NEW WORD COUNT MOV SAVE,SWRDCT ROR SWRDCT MOV SWRDCT,WRDCT MOV #BIT7,@CSR ;SET UP PRIORITY LEVEL MOV #NEWBUF,HRDER ;SET UP FOR HARD ERROR CLR DMA CLR TRACK NEWBUF: MOV WRDCT,WORK ;SET UP FOR RANDOM BUFFER MOV #OUTBUF,%1 JSR %5,RANDOM ;NEW DATA BUFFER GENERATED MOV #OUTBUF,BUF WRITE+100 ;WRITE BUFFER BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK+100 ;WRITE CHECK DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV Py@DAR ;DISK ADDRESS REG LOADED MOV #INBUF,@CMA ;LOAD CURRENT ADDRESS MOV #177777,@WC ;LOAD WORD COUNT BIS #5,@DCS ;GO AND READ CTBUSY: TSTB @DCS ;TEST FOR CONTROL NOT READY BPL CTBUSY ;WAIT FOR CONTROL NOT READY SRCHG: CMP WORK1,@SR BNE STAMP ;SR HAS CHANGED BR SRCHG ;SR HAS NOT CHANGED ; ; ; ; ; ; ; ;ROUTINE TO REPORT ERROR COUNT AND CONTENTS OF ONE REGISTER ; STAER: JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK ;DATA TO BE CONVERTED MES10 ;ADDRESS OF MESSAGE 6 JSR %zOCK 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" 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 I{STACK BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #OUTBUF,BUF ;SET CURRENT ADDRESS MOV #4,WRDCT ; SET WORD COUNT INSWT: WRITE ;GO WRITE TSTB @DCS ;IS READY SET BPL .-4 ;YES! WAIT FOR NOT BUSY TST @DCS ;TEST FOR ERROR BPL TSTTK ;NO ERROR GO ON MOV #11,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTENTS OF DCS REG ER11: JSR %5,STAER ;REPORT ERROR OCCURRED ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR INSWT ;GO RE-WRITE TSTTK: CMP |RIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR NEWBUF ;GO WRITE NEW BUFFER BR NEWBUF-10 ;DISK COMPLETE START AGAIN ; ;BACKGROUND TEST FOR INTERRUPTS ; XWAIT: MOV #RTIX,14 ;SET UP TRACE TRAP CLR 16 MOV #-1000,PASS ;SET UP TIME BASE BIS #BIT4,@CSR ;SET TRACE BIT CLR #0 XINCW: INC XINCW-2 TSTB XINCW-2 BPL XINCW INC PASS BEQ .+4 BR XINCW-4 ;REPORT BACKGROUND TEST TIMED OUT MOV #340,@CSR BIC #BIT4,@CSR ;CLEAR TRACE BIT EMT+1 TIMO HALT ; RTIX: RTI }5,CONV ;CONVERT OCTAL TO ASCII ERCOUNT ;ERROR COUNT TO BE CONVERTED HED5 ;ADDRESS OF MESSAGE 3 EMT +0 ;REPORT MESSAGE HED5A HED5 MES10 -1 RTS %5 ;EXIT ROUTINE ; ;ROUTINE TO REPORT ERROR COUNT AND THE CONTENTS OF TWO REGISTERS ; ; ; STAER1: JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK ;DATA TO BE CONVERTED MES10 ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK1 ;DATA TO BE CONVERT MES10A ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ~N 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 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  #7777,OUTBUF ; TEST FOR LAST ADDRESS BEQ INSRD ;GO READ THE DATA BIT #77,OUTBUF ; IS IT SECTOR NUMBER ZERO BNE MVNEM ;NO BIS #77,OUTBUF ; YES, SET UP FOR LAST SECTOR IN TRACK BIS #77,OUTBUF+2 BIS #77,OUTBUF+4 BIS #77,OUTBUF+6 ADD #77,DMA BR INSWT ;GO WRITE MVNEM: INC OUTBUF ;INC. TO NEXT TRACK INC OUTBUF+2 INC OUTBUF+4 INC OUTBUF+6 CLR DMA INC T;RF11 POWER FAIL TEST "1 ; DISK ZERO ; WRITE COMPLETE DISK WITH 125252 PATTERN ; REPORT "OK" ;START WRITING THE SAME PATTERN ;WHEN POWER FAIL OCCURS ABORT TRANSFER ;SETUP NEW ENTRY POINT AND HALT ; ;POWER UP AND WRITE CHECK THE DISK FOR ERRORS ; ;***ONLY ONE ERROR IS CONSIDERED ACCEPTABLE*** ; ; PFT1: MOV #1000,%6 ;SET UP STACK JSR %7,POWFAL ;WRITE 125252 ON DISK PFWAT: BIS #BIT8,@DCS ;CLEAR DISK CLR DMA CLR TRACK MOV #PFWAT,HRDER ;SET UP FOR HARD ERROR MOV #DOWN,24 ;SET UP POWER FASCII ERCOUNT ;ERROR COUNT TO BE CONVERTED HED5 ;ADDRESS OF MESSAGE 3 EMT +0 ;REPORT MESSAGE HED5A HED5 MES10 MES10A -1 RTS %5 ;EXIT ROUTINE ; ; ;ROUTINE TO DECODE EMT CALLS ;EMT+1=TYPE ONE LINE OF TEXT ;EMT+0=TYPE A SERIES OF LINES EMTRP: MOV (6),%0 CMP #EMT+1,-(0) ;WAS THE CALL EMT+1 BNE TYPS ;NO! TYPE A SERIES OF LINES OF TEXT BR TYP ;YES TYPE ONE LINE OF TEXT ;SUBROUTINE TO OUTPUT ASCII MESSAGE ON TELETYPE PRINTER. TYP: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS ;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 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 RACK ;INC. DAE REG. BR INSWT ;GO WRITE ; ;READ THE FIRST AND LAST ADDRESS OF EACH TRACK ;AND VERIFY IT HAS THE CORRECT DATA INSRD: CLR DMA ;CLEAR WORK REG. CLR TRACK CLR SAVE BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #INBUF,BUF ;SET UP CURRENT ADDR MOV #4,WRDCT ; SET UP WORD COUNT RDTKS: READ ;READ DATA TSTB @DCS ;CHECK FOR READY BPL .-4 ;CONTROL NOT READY TST @DCS ;IS THERE AN ERROR BPL CMPDTK ;NO ERROR MOV #12,ERCOUNT ;SET UP ERROR COUNT MOV @DAIL VEC. MOV #340,26 MYBYWR: WRITE +100 BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR MYBYWR BR PFWAT ;ROUTINE TO CHECK DATA AFTER POWER FAIL ; UPCHK: BIS #BIT8,@DCS ;CLEAR THE DISK CLR DMA CLR TRACK MOV #UPCHK,HRDER ;SET UP FOR HARD ERROR CHKDAT: WRCHECK +100 BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR CHKDAT JMP PFWAT ;GO WAIT FOR ANOTHER ;POWER MESSAGE ADDRESS ADD #2,@%6 ;SET UP EXIT. MOV @%0,%0 ;ADDRESS OF MESSAGE TO R0. TYPA: MOVB (0)+,TYPDAT ;GET CHARACTER CMPB #100,TYPDAT ;CHECK FOR "@" CHARACTER BNE TYPC ;CRANCH IF NOT "@". RTI ;TERMINATOR CHAR. DONE. EXIT. TYPC: CMPB #45,TYPDAT ;CHECK FOR "%". BEQ TYPF ;BRANCH IF "%". CMPB #42,TYPDAT ;NOT "%". CHECK FOR "#". BEQ TYPG ;BRANCH IF "#" JSR %7,TYPD ;TYPE CHAR IN TYPDAT BR TYPA TYPD: BIT #BIT14,@SR BNE TYEXIT MOVB TYPDAT,@TPB ;OUTPUT CHARACTER TO PRINTER TSTADD 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 INCB 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 BYTCS,WORK ;FETCH CONTENTS OF DCS ER12: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR RDTKS ;GO RE-READ CMPDTK: CMP SAVE,INBUF ;IS DATA CORRECT BEQ CMNETK ;YES SETUP FOR NEXT WORD MOV SAVE,WORK1 ;CORRECT ADDRESS MOV INBUF,WORK ;INCORRECT DATA MOV #13,ERCOUNT ;SET UP ERROR COUNT ER13: JSR %5,STAER1 ;REPORT SELECTION ERROR ;****WRD1=TRACK ADDR. WANTED **** ;****WRD2=TRACK ADDR. RECEIVED **** CMNETK: CMP #7777,SAVE ; IS IT THE FAIL ; ;POWER DOWN ROUTINE ;ABORT DISK AND HALT ; ; DOWN: BIS #BIT8,@DCS ;ABORT DISK MOV #UP,24 ;SET POWER FAIL VECTOR HALT ; UP: MOV #DOWN,24 MOV #1000,%6 MOV #-300.,WORK ;SET UP TWENTY SECOND TIMER TIMCNT: RESET INC WORK ;+1 TIMER BNE TIMCNT ;TWO SECONDS NOT UP GO WAIT JMP UPCHK ;GO CHECK DISK ; ; ; ; ; ; ;POWER FAIL TEST #2 ;DISK ZERO ;WRITE COMPLETE DISK WITH 125252 PATTERN ;REPORT "OK" ;WRITE CHECK DISK AND WAIT FOR POWER FAIL ;WHEN POWER COMES BACK WRITE CB @TPS ;WAIT FOR DONE FLAG. BPL .-4 TYEXIT: RTS %7 ;EXIT TYPF: MOVB #15,TYPDAT ;MOVE CARRIAGE RETURN CODE TO TYPDAT JSR %7,TYPD ;GO TYPE CHAR. TYPG: MOVB #12,TYPDAT ;MOVE LF CODE TO TYPDAT. JSR %7,TYPD ;GO TYPE CHAR. BR TYPA TYPDAT: 0 ;SUBROUTINE TO OUTPUT A SERIES OF ASCII MESSAGES ON TELETYPE PRINTER TYPS: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;UPDATE TO NEXT MESSAGE ADDRESS MOV @%0,TYPSB ;ADDRESS OF MESSAGE TO TYPSB CMP #-1,TYPSB ;CHECK FOR TERMINATOE 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 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  LAST ADDRESS BEQ LPTSK ;END OF TEST BIT #77,SAVE ; IS IT ADDRESS ZERO OF THE TRACK BEQ ZRBIT ;NO! SETUP FOR LAST ADDR INC SAVE ;INC FOR TRACK NO. CLR DMA ; SET UP DAR INC TRACK ;INC TRACK BR RDTKS ;GO READ ZRBIT: BIS #77,SAVE ; SET UP FOR LAST SECTOR IN TRACK ADD #77,DMA BR RDTKS ;GO READ LAST ADDR OF TK LPTSK: BIT #BIT11,@SR ;IS BIT 11 SET IN SR BEQ ADT5 ; YES, LOOP ON TEST JMP ADT4 HECK DISK AGAIN ;AND CHECK FOR ERRORS ;***NO ERRORS SHOULD OCCUR.*** ; ;DO NOT CREATE ANOTHER POWER FAIL UNTIL ;THE ADDRESS REGISTER HAS COMPLETELY CYCLED ;THROUGH. ; PFT2: MOV #1000,%6 ;SET UP STACK JSR %7,POWFAL ;WRITE 125252 ON DISK PWRFL: CLR DMA CLR TRACK MOV #PWRFL,HRDER ;SET UP HARD ERROR MOV #PWRDN,24 ;SET UP POWER FAIL VEC. MOV #340,26 CHKDSK: WRCHECK +100 BIT #BIT9,@SR BNE .+6 IOT ;WAIT IN BACKGROUND BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;CHECK NEXT BUFR BNE TYPSA ;BRANCH IF NOT TERMINATOR. RTI ;TERMINATOR. EXIT TYPSA: EMT +1 ;CALL ON TYP SUB TO TYPE MESSAGE TYPSB: 0 ;ADDRESS OF MESSAGE GOES HERE BR TYPS ;GO PROCESS NEXT MESSAGE ; ; ;OCTAL TO ASCII CONVERT ROUTINE ; ;ENTER ROUTINE AS FOLLOWS ;JSR%5,CONV ;ADDR#=ADDRESS OF NUMBER TO BE CONVERTED ;ADDR BYTE=LSB OF WHERE ASCII IS GOING ;ASCII#=THE NUMBER OF ASCII CHAR. TO BE CONVERTED ; ; CONV: MOV @(5)+,ACNVX ;VALUE OF # TO BE CONVERTED MOV (5)+,%1 ;ASCII ADDR MOV (5)+,%2 ; #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 ;BLOCK BYTE COUNT ERROR JSR PC,ERRPRT LDER03: MOV #3,R4 ;OBJ MOD BLOCK CHECKSUM ERROR JSR PC,ERRPRT .PAGE SUBPUT: ADDPUT: ;******* TXTP .PAGE ;RF11 LOOK AHEAD TEST ;WRITE ONE WORD UPON RECEIPT OF ;NOT READY READ THE LOOK AHEAD ;REGISTER IT SHOULD CONTAIN THE ;ADDRESS +1 ; ADT5: CLR DMA ;CLEAR REGISTERS CLR TRACK CLR SAVE MOV #1000,%6 ;SETUP STACK MOV #4,WRDCT ; SET UP FOR MINIMUM X-FER MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS WRADT5: MOV ADS,R0 ; PLACE ADDRESS OF LOOK AHEAD REG IN RO BIS #BIT8,@DCS ;CLEAR THE DISK WRITE ;WRITE 1$: MOV (%0),@#WORK ;FETCH LOOK AHEAD TFER BR CHKDSK BR PWRFL ; ;ROUTINE TO ABORT DISK DURING POWER FAIL ; PWRDN: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #PWRUP,24 ;SET UP RESTART HALT ; PWRUP: MOV #PWRDN,24 ;RESET POWER FAIL VECTOR MOV #1000,%6 MOV #-300.,WORK ;SET UP TWENTY SECOND TIMER XTIMCNT: RESET INC WORK ;+1 TIMER BNE XTIMCNT ;TWO SECONDS NOT UP GO WAIT BR PWRFL ;GO CHECK DISK ; ; ; ; ; ;ROUTINE TO WRITE THE COMPLETE DISK ;WITH 125252 PATTERN ;WRITE CHECK AND REPORT ERRORS IF THEY ;OCCUR ;REPORT "O# OF ASCII CHAR ADD %2,%1 ACVN: MOV ACNVX,%3 BIC #177770,%3 ;ISOLATE LEAST SIGNIFICANT OCTAL# ADD #60,%3 ;SET UP ASCII# MOVB %3,-(1) ;STORE ASCII CHAR BIC #7,ACNVX ROR ACNVX ;ROTATE OCTAL# ROR ACNVX ROR ACNVX DEC %2 ;-1 FROM ASCII CHAR COUNT BNE ACVN RTS %5 ;EXIT # CONVERTED ACNVX: 0 ;WORK REGISTER ; ;ROUTINE TO HANDLE KEYBOARD CONVERSATION ;ROUTINE ACCEPTS NUM. OR ALPHA CHARACTERS ; NOCHA: MOV #40,TSTCH ;SET UP FOR NUM. CHAR. BR TYST ALPHA: MOV #100,TSTCH ;SET UP FOUT: ;SUBROUTINE TO PUT LINKED BYTE OR WORD INTO TEXT. ; CHECK IS MADE TO BE SURE A LINKED BYTE DID NOT OVERFLOW 8 BITS. MOVB R4,(R3)+ ;PLACE FIRST BYTE INTO TEXT TST R2 ;COMMAND BMI TXTP20 ;BYTE SWAB R4 MOVB R4,(R3)+ ;LOAD UPPER BYTE TXTP10: RTS PC TXTP20: SWAB R4 BEQ TXTP10 ;UPPER BYTE HAD TO BE ZERO LDER25: MOV #25+100000,R4 ;BYTE RELOCATION ERROR STB @DCS ; IS THE CONTROLLER BUSY BPL 1$ ;CONTROL STILL BUSY TST @DCS ;IS THERE AN ERROR BPL LPADT5 ;NO DISK ERRORS MOV #14,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH DCS FOR REPORT ER14: JSR %5,STAER ;REPROT CONTROL ERROR ;****WRD1=DISK CONTROL REG AT THE TIME OF THE ERROR **** BR WRADT5 ;LOOP ON ERROR LPADT5: MOV TRACK,R2 BIC #177000,R2 ASH #6,R2 MOV DMA,R1 BIC #177700,R1 ADD R1,R2 K" AT COMPLETION POWFAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV (6),PASSC MOV #1000,%6 MOV #20,PATNU ;SET UP PATTERN CLR DMA CLR TRACK MOV #2000,SWRDCT ;SETUP WORD COUNT MOV SWRDCT,WRDCT JSR %5,PASEL ;GENERATE DATA BUFFER MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV #POWFAL,HRDER WRDNW: WRITE +100 BIT #BIT9,@SR ;CHECK ON HOW TO WAIT BNE .+6 IOT ;BACKGROUND TEST BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK +100 BIT #BIT9,@SR ; BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIR ALPHA CHAR TYST: MOV #340,@CSR ;LOCK UP INTERRUPTS CLR TEXBUF ;CLEAR TEXT BUFFER REG TSTFLG: TSTB @TKS ;CHECK FOR FLAG BPL TSTFLG ; MOV @TKB,@TPB ;CHARACTER IN BUFFER TSTB @TPS ;ECHO CHARACTER BPL .-4 CMP #377,@TKB ;CHECK FOR RUB-OUT BNE CKCH ;EXIT IF NOT RUB-OUT EMT +1 MES8 ;REPORT RUB-OUT ACKNOWLEDGED BIC #7,TEXBUF ROR TEXBUF ROR TEXBUF ROR TEXBUF BR TSTFLG ;GO WAIT FOR NEW CHAR. CKCH: CMP #215,@TKB ;CHECK FOR CARRIAGE RETURN BNE .+4 RTS %7 ;EXIT DELIMITER T ;******* JSR PC,ERRPRT ;******* RTS PC ;******* ;WHICH WILL THEN RETURN TO OUR CALLER ; ******************************************************************** TEXTIO: MOV #TXTLST,-(SP) EMT DISCIO ;GO READ OR WRITE WITH TEXT TST TXTERR ;ANY ERRORS? BNE LDER05  ADD #2,R2 CMP R2,WORK BEQ INCADS ;BRANCH IF EQUAL MOV R2,WORK1 MOV #15,ERCOUNT ER15: JSR %5,STAER1 ;REPORT LOOK AHEAD INCORRECT ;****WRD1=DISK ADDR. WANTED FROM LOOK AHEAD REG. **** ;****WRD2=DISK ADDR. RECEIVED FROM DISK LOOK AHEAD REG. **** BR WRADT5 ;LOOP ON ERROR INCADS: CMP #10000,R2 BEQ XLPADT5 ;LAST ADDRESS EXIT INC DMA ;+1 DMA CMP #100,DMA BNE WRADT5 CLR DMA INC TRACK BR WRADT5 ;CHT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR WRDNW ;WRITE NEW BUFFER EMT +1 OK JMP @PASSC ;ROUTINE TO ALLOW THE OPERATOR TO SET BITS ;IN THE I/O REGISTERS VIA THE SWITCH REGISTER ; ;WORD COUNT REGISTER SELWC: MOV @SR,@WC ;MOV SR INTO WORD COUNT REG BR SELWC ; ;CURRENT ADDRESS REGISTER SELCMA: MOV @SR,@CMA ;MOV SR INTO CURRENT ADDR REG BR SELCMA ; ;DISK ADDRESS REGISTER SELDAR: MOV @SR,@DAR ;MOV SR INTO DISK ADDR REG BR SELDAR ; ;DISK ADDRESS EXT AND ERROR REGISTER SELDAE: YPED BIT TSTCH,@TKB BNE CHOK EMT +1 ;REPORT QUESTION MARK MES7 BR TSTFLG ;WAIT FOR CORRECT CHAR. CHOK: MOV @TKB,WORK BIC #177770,WORK CLC ROL TEXBUF CLC ROL TEXBUF CLC ROL TEXBUF ADD WORK,TEXBUF ;ADD CHARACTER BR TSTFLG ;WAIT FOR NEW CHARACTER TEXBUF: 0 TSTCH: 0 ; ; THIS ROUTINE SETS UP THE D D C DEVICE PAGE REGISTERS ; USAGE; PLACE LOGICAL DISK NUMBER IN R0 AND JSR PC,SETREG ; SETREG: MOV R0,R1 BIC #177774,R0 ASH #4,R0RTS PC LDER05: MOV #5,R4 JSR PC,ERRPRT ;DISCIO ERROR WITH TEXT .PAGE ; " T X T O U T " ; ("TXTBC" MAY BE ZERO, WHICH INDICATES "CURPC" HAS BEEN SET TO A NEW ; VALUE BY AN RLD COMMAND. IF THE NEW PC STILL FALLS WITHIN BLOCK #1, ; NO TRANSFER WILL OCCUR. IF THE NEW PC IS INTO THE SECOND BLOCK, OR ; OUTSIDE THE TWO BLOCKS, BOTH BLOCKS WILL BE WRITTEN OUT, AND THE ; APPROPRIATE NEW TWO BLOCKS WILL BE READ IN. IN MANY CASES THIS WILL ; MEAN THAT A ECK NEXT ADDRESS XLPADT5:BIT #BIT11,@SR ;LOOP ON TEST BNE ADT5 ;YES LOOP ON TEST BIT 11 SET .PAGE ; SPIRAL TESTS ; ;WRITE THE LAST WORD OF TRACK ZERO ;AND THE FIRST WORD OF TRACK ONE ;USING ONE WORD X-FERS ;DATE = 52525 SPIRAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PROCESSING MOV #1000,%6 ;SETUP STACK MOV #100,WRDCT ; SET WORD COUNT TO 100 CLR TRACK MOV #77,DMA ; LAST SECTOR OF TRACT ZERO MOV #100,R0 ;MOV @SR,@DAE ;MOV SR INTO DISK ADDR EXT REG BR SELDAE ; ;DATA BUFFER REGISTER SELDBR: MOV @SR,@DBR ; MOV SR INTO DATA BUFFER BR SELDBR ; ; ;LOOK AHEAD REGISTER MOVLK: MOV @ADS,%0 ;MOVE LOOK AHEAD RESET RESET BR MOVLK ;INTO REGISTER 0 ; ; ;DISK CONTROL STATUS REGISTER SELDCS: MOV #340,@CSR ;LOCK UP INTERRUPTS MOV #177777,@WC ;SET WORD COUNT -1 WORD MOV #OUTBUF,@CMA ;SET UP CURRENT ADDRESS MOV @SR,@DCS ;MOV SR INTO CONTROL REG BIT #BIT0,@DCS ;IS FUNCTION BITS SET BEQ SELDCS ; MULT BY 20 BIC #177773,R1 ; ADD IN THE 400 ASH #6,R1 ; WORD OFFSET ADD R1,R0 ; IF DISK 4-7 ADD #165300,R0 MOV #10,R1 ; NUMBER OF REGISTERS 2$: MOV R0,(R2)+ TST (R0)+ SOB R1,2$ RTS PC ; RETURN ; ;ERROR MESSAGE HEADERS ; HED1: .ASCII /%DATA ERR @/ ; HED2: .ASCII /%STATUS ERR @/ ; HED3: .ASCII /%EXTRA BKS @/ ; HED4: .ASPARTIALLY-WRITTEN TEXT BLOCK #2 WILL BE WRITTEN TO DISC, ; ONLY TO BE READ BACK IN AGAIN INTO BLOCK #1. IN THIS WAY, ; WE CAN BUFFER OUR TEXT OUT ONE SECTOR AT A TIME, AND PROTECT THE ; INTEGRITY OF OUR NEWLY CREATED TEXT.) TXTOUT: ;SUBROUTINE TO OUTPUT ACCUMULATED TEXT IF BUFFER IS FULL ADD TXTBC,CURPC ;BUMP LOC'N CTR TO BGN OF NXT TEXT BLOCK MOV CURPC,-(SP) ;SAVE FOR WORK BELOW MOV TXTORG,R4 ;PC VALUE @ BGN OF RESIDENT TEXT MO SET UP DATA MOV #OUTBUF,R1 1$: MOV #52525,(R1)+ SOB R0,1$ MOV #OUTBUF,BUF WRITE ;WRITE LAST ADDR TK ZERO TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL1 MOV #16,ERCOUNT MOV @DCS,WORK ER16: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL1: CLR DMA INC TRACK WRITE ;WRITE FIRST ADDR. TK 1 TSTB @DCS ;WAIT FOR READY BPL .-4 ;CONTROL STILL BUSY TST  ;FUNCTION BITS NOT SET DKBUSY: TSTB @DCS ;TEST FOR DISK NOT READY BPL DKBUSY ;DISK STILL READY BR SELDCS ;DISK NOT BUSY SELECT NEW CR ; ; ; ; ; ; ; ; ;THIS ROUTINE ENABLES THE OPERATOR TO SELECT A TRACK STATICLY ;THE ROUTINE DOES A ONE WORD READ TO SELECT THE TRACK ;THE OPERATOR MAY CHANGE THE SWITCH REGISTER AT ANY TIME ;SR6-0 EQUALS THE TRACK NUMBER ;SR9-7 EQUALS THE DISK NUMBER ; STAMP: BIS #BIT8,@DCS MOV @SR,WORK1 ;FETCH SR MOV WORK1,WORK BIC #176000,WORK ;MASK THE TRACII /%DK ADDR ERR @/ ; HED5A: .ASCII /%@/ ; HED5: .ASCII / ERR CNT @/ ; HED6: .ASCII /%RANEX ERR @/ .PAGE ;MESSAGE TRAILERS ; MES1: .ASCII / DAR @/ ; MES1A: .ASCII / DAE @/ ; MES2: .ASCII / DCS @/ ; MES2A: .ASCII / HRD ERR@/ ; MES3: .ASCII / WRD CNT@/ ; MES4: .ASCII / WRD ADDR.@/ ; MES5: .ASCII / GD DATA @/ ; MES6: .ASCII / BD DATA @/ ; MES7: .ASCII /?@/ ; MES8: .ASCII '/@' ; MES10: .ASCII / WRD1 @/ ; MES10A: .ASCIV R4,R3 ;KEEP R4 @ CURPC IN CASE OF NO TRANSFER CMP (SP),R4 ;IS NEW PC BELOW TEXT IN BLOCK ONE? BLO TXTO10 ;YES - REPLACE TEXT ADD #128.,R3 ;PC OF FIRST BYTE IN SECOND BLCOK CMP (SP),R3 ;NEW PC ABOVE BLK #1: IS IT BELOW BK #2? BLO TXTO40 ;YES: NO TRANSFER NEEDED THIS TIME .PAGE TXTO10: ;HERE TO WRITE CURRENT TEXT OUT AND READ NEW TEXT IN--- MOVB #1,TXT@DCS BPL SPIL2 MOV #17,ERCOUNT MOV @DCS,WORK ER17: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL2: MOV #200,WRDCT ; SET UP FOR 2 SECTOR X-FER DEC TRACK MOV #77,DMA MOV #INBUF,BUF ; READ ;READ DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL3 MOV #20,ERCOUNT MOV @DCS,WORK ER20: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPCK AND DISK NO. ROR WORK ROR WORK ROR WORK ROR WORK ROR WORK MOV WORK,@DAE ;DISK EXT. ADDR. REG. LOADED MOV @SR,WORK SWAB WORK ROL WORK ROL WORK ROL WORK BIC #3777,WORK MOV WORK,@DAR ;DISK ADDRESS REG LOADED MOV #INBUF,@CMA ;LOAD CURRENT ADDRESS MOV #177777,@WC ;LOAD WORD COUNT BIS #5,@DCS ;GO AND READ CTBUSY: TSTB @DCS ;TEST FOR CONTROL NOT READY BPL CTBUSY ;WAIT FOR CONTROL NOT READY SRCHG: CMP WORK1,@SR BNE STAMP ;SR HAS CHANGED BR SRCHG ;SR HAS NOT CHANGED I / WRD2 @/ ; MES11: .ASCII /%UNIT NO.@/ ; MES12: .ASCII / @/ ; MES13: .ASCII / READ @/ ; TIMO: .ASCII /%CPU BKGRND TIMED OUT@/ ; OK: .ASCII /%OK!@/ ;CONVERSATION TEXT ; ; CON1: .ASCII /%DATA TEST ONLY? @/ ; CON2: .ASCII /%MULTI DK MODE?@/ ; CON3: .ASCII /%# OF DKS 1 TO 10 OCTAL?@/ ; CON4: .ASCII /%EX. DK?@/ ; CON5: .ASCII /%OPT WRD CNT? @/ ; CON6: .ASCII /%LENGTH (1 TO 1000)?@/ ; CON7: .ASCII /%WRD ADDR?@/ ; CON8: .ASCII /%OPT. DATA PAT. #?@/ ; CON9: .ASCII /%WRITER.W ;WRITE JSR PC,TEXTIO ;GO READ OR WRITE WITH"TXTLST" MOV (SP),R3 ;NEW "CURPC" ASR R3 ;NOW GET SECTOR FOR NEW PC BIC #100000,R3 ;SUPPRESS EXTENDED SIGN ASR R3 ASR R3 ASR R3 ASR R3 ASR R3 ASR R3 MOV R3,R4 ;SAVE NEW SECTOR (RELATIVE TO TEXT BGN) ADD BFSECT,R3 ;SECTOR RELATIVE TO BEGIN OF BATCH FILIRAL SPIL3: MOV #100,R0 ; CHECK INPUT FROM LAST SECTOR OF TRACK 0 MOV #INBUF,R1 1$: CMP #52525,(R1)+ BNE 2$ SOB R0,1$ BR CMPX1 2$: MOV #21,ERCOUNT ;SETUP ERROR COUNT MOV -(R1),WORK MOV #52525,WORK1 ;CORRECT DATA ER21: JSR %5,STAER1 ;REPORT ADDR 377 HAE BAD DATA ;****WRD1=THE DATA THAT SHOULD HAVE BEEN IN ADDR. 3777**** ;****WRD2=THE DATA READ FROM ADDR. 3777**** BR SPIRAL ;LOOP ON ERROR CMPX1: MOV  ; ; ; ; ; ; ; ;ROUTINE TO REPORT ERROR COUNT AND CONTENTS OF ONE REGISTER ; STAER: JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK ;DATA TO BE CONVERTED MES10 ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII ERCOUNT ;ERROR COUNT TO BE CONVERTED HED5 ;ADDRESS OF MESSAGE 3 EMT +0 ;REPORT MESSAGE HED5A HED5 MES10 -1 RTS %5 ;EXIT ROUTINE ; ;ROUTINE TO REPORT ERROR COUNT AND THE CONTENTS OF TWO REGISTERS ; ; ; STAER1: JSR %5,CONV ;CONVERT OCTAL TO ASCI?@/ ; CON10: .ASCII /%WRITE CHECK?@/ ; CON11: .ASCII /%READ?@/ ; END: .ASCII /%END@/ .EVEN ; .WORD 25252 OUTBUF: .BLKW 4000 ; INBUF: .BLKW 4000 .WORD 25252 RFBUF: .WORD 0 .END BEGIN E MOV R3,TXTSEC ;SET FOR UPCOMING READ & SUBSQNT WRITES CLRB TXTR.W ;PREPARE FOR NEW TEXT READ JSR PC,TEXTIO ;GO READ OR WRITE WITH"TXTLST" ASL R4 ;NOW GET PC AT BEGIN OF NEW TEXT ASL R4 ASL R4 ASL R4 ASL R4 ASL R4 ASL R4 MOV R4,TXTORG ;NEW BEGIN PC TXTO40: ;ALWAYS RE-CALCULATE "TXTPTR", IN CASE OF A PC CHANGE  #100,R0 1$: CMP #52525,(R1)+ BNE 2$ SOB R0,1$ BR LPSPI1 2$: MOV #22,ERCOUNT ;SETUP ERROR COUNT MOV #52525,WORK1 ;CORRECT DATA MOV -(R1),WORK ER22: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR. 0 OF TRACK 1 **** ;****WDR2=THE DATA READ FROMADDR.0 OF TRACK 1 **** SPIL5: JMP SPIRAL LPSPI1: BIT #BIT11,@SR ;LOOP ON TEST? BNE SPIL5 .PAGE ; SPIRAL TEST EXT. ; ;WRITE TWO WORDS OF DI WORK ;DATA TO BE CONVERTED MES10 ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK1 ;DATA TO BE CONVERT MES10A ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII ERCOUNT ;ERROR COUNT TO BE CONVERTED HED5 ;ADDRESS OF MESSAGE 3 EMT +0 ;REPORT MESSAGE HED5A HED5 MES10 MES10A -1 RTS %5 ;EXIT ROUTINE ; ; ;ROUTINE TO DECODE EMT CALLS ;EMT+1=TYPE ONE LINE OF TEXT ;EMT+0=TYPE A SERIES OF LINES EMTRP: MOV (6),%0 CMP #EMT+1,-(0) ;WAS  BR LODK20 ;BACK FOR MORE ;******* 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 (SP)+,R3 ;PC FOR BEGIN OF NEXT TEXT BLOCK ;******* SUB R4,R3 ;GET OFFSET FROM TOP OF TEXT AREA ADD #TXTBK1,R3 MOV R3,TXTPTR ;ACTUAL POINTER TO NEXT OPEN TEXT WORD ;******* RTS PC .PAGE LPCALL: ;COMMON ROUTINE TO MAKE EMT TO LINE PRINTER MOV #MAPLST,-(SP) EMT LPRNTR ;LINE PRINTER ATA ;STARTING WITH THE LAST ADDRESS OF TRACK0 ;DATA PATTERN = 25252 ;THEN READ THE DATA DOING ONE WORD ;X-FERS XSPIRL: BIS #BIT8,@DCS ; CLEAR MOV #340,@CSR ;LOCK UP PROCESSING MOV #1000,%6 ;SET UP STACK MOV 200,R0 ; SET UP 2 SECTORS OF DATA MOV #OUTBUF,R1 1$: MOV #25252,(R1)+ SOB R0,1$ MOV #200,WRDCT ; SET WORD COUNT FOR 2 SECTORS MOV #OUTBUF,BUF ;SET UP CMA CLR TRACK ;SET UP DISK ADDR. MOV #77THE CALL EMT+1 BNE TYPS ;NO! TYPE A SERIES OF LINES OF TEXT BR TYP ;YES TYPE ONE LINE OF TEXT ;SUBROUTINE TO OUTPUT ASCII MESSAGE ON TELETYPE PRINTER. TYP: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;SET UP EXIT. MOV @%0,%0 ;ADDRESS OF MESSAGE TO R0. TYPA: MOVB (0)+,TYPDAT ;GET CHARACTER CMPB #100,TYPDAT ;CHECK FOR "@" CHARACTER BNE TYPC ;CRANCH IF NOT "@". RTI ;TERMINATOR CHAR. DONE. EXIT. TYPC: CMPB #45,TYPDAT ;CHECK FOR "%". BEQ TYPF ;BRANCH IF "%". MOV #2,TSWICH ;PUT OUT TEXT: THEN GET NEW MODULE BR LODK52 ;GO OUTPUT TEXT LODK50: ;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 SY RTS PC ; ******************************************************************** ; SUBROUTINE "BINARY TO OCTAL ASCII CONVERSION" ; INPUT: R2 = ITERATION LENGTH (IF ENTER @"B2ONTA") ; R3 = DESTINATION END ADDRESS+1 ; R4 = BINARY NUMBER BIN2OC: MOV #6,R2 ;INIT ITERATION LENGTH (NORMAL 6 CHARS) B2ONTA: ;ENTER HERE WHEN PRE-SETTING ITERATION LENGTH MOVB R4,-(R3) ;ALS,DMA WRITE ;WRITE DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X1SPIL ;BRANCH IF NO ERROR MOV @DCS,WORK MOV #23,ERCOUNT ;SET UP ERROR COUNT ER23: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR XSPIRL X1SPIL: MOV #100,WRDCT ; SET UP FOR 100 WORD X-FER CLR TRACK MOV #77,DMA ; SET UP DAR MOV #INBUF,BUF ;SET UP CMA R CMPB #42,TYPDAT ;NOT "%". CHECK FOR "#". BEQ TYPG ;BRANCH IF "#" JSR %7,TYPD ;TYPE CHAR IN TYPDAT BR TYPA TYPD: BIT #BIT14,@SR BNE TYEXIT MOVB TYPDAT,@TPB ;OUTPUT CHARACTER TO PRINTER TSTB @TPS ;WAIT FOR DONE FLAG. BPL .-4 TYEXIT: RTS %7 ;EXIT TYPF: MOVB #15,TYPDAT ;MOVE CARRIAGE RETURN CODE TO TYPDAT JSR %7,TYPD ;GO TYPE CHAR. TYPG: MOVB #12,TYPDAT ;MOVE LF CODE TO TYPDAT. JSR %7,TYPD ;GO TYPE CHAR. BR TYPA TYPDAT: 0 ;SUBROUTINE TO OUTPUT A SERIES OF ASCII MESSAGES ON TEMBOL: ADD SECTION BASE TO LOCAL OFFSET - ;"ADD BIAS" INSTRUCTION INTO TRAILER MOV (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 R1O LOOP RETURN FOR NEXT OCTAL DIGIT BICB #370,(R3) ;LEAVE ONLY LEAST SIGNIFICANT THREE BITS BISB #060,(R3) ;CHANGE TO ASCII CODE ASR R4 ;BEGIN SHIFTING FOR NEXT OCTAL DIGIT BIC #100000,R4 ;PREVENT SIGN PROPAGATION ASR R4 ASR R4 DEC R2 ;MORE ASCII DIGITS TO GO? BGT B2ONTA ;BACK FOR MORE RTS PC ;ASCII BUFFER FILLED: RETURN ; EAD ;READ DAR 3777 TSTB @DCS ;TEST FOR NOT READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X2SPIL ;BRANCH IF NO ERROR MOV #24,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTROL REG ER24: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE THE ERROR **** BR XSPIRL X2SPIL: MOV #100,R0 ; CHECK INPUT FROM LAST SECTOR OF TRACK 0 MOV #INBUF,R1 1$: CMP #25252,(R1)+ BNE 2$ SOLETYPE PRINTER TYPS: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;UPDATE TO NEXT MESSAGE ADDRESS MOV @%0,TYPSB ;ADDRESS OF MESSAGE TO TYPSB CMP #-1,TYPSB ;CHECK FOR TERMINATOR BNE TYPSA ;BRANCH IF NOT TERMINATOR. RTI ;TERMINATOR. EXIT TYPSA: EMT +1 ;CALL ON TYP SUB TO TYPE MESSAGE TYPSB: 0 ;ADDRESS OF MESSAGE GOES HERE BR TYPS ;GO PROCESS NEXT MESSAGE ; ; ; ; ;OCTAL TO ASCII CONVERT ROUTINE ; ;ENTER ROUTINE AS FOLLOWS ;JSR%5,CONV ;ADDR#=ADDRESS OF NUMB,R4 ;POINTS TO GLOBAL NAME CMP (R1)+,(R1)+ ;BUMP PTR PAST NAME JSR PC,SRGLOB ;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 JS ******************************************************************** ERRPRT = . ;ERROR MESSAGE PRINTING ROUTINE ;******* ; R4 ALREADY INITED WITH BINARY ERROR NUMBER ; IF MSB IS SET, WILL RETURN TO CALLER; ELSE WILL EXIT . JSR R5,REGSAV ;IN CASE WE RETURN MOV #ERRNUM+3,R3 ;LAST CHAR IN ASCII BUFFER MOV #3,R2 ;A 3-CHAR MESSAGE NUMBERR JSR PC,B2ONTA ;USE SECONDARY ENTRY POINT TO COB R0,1$ BR X3SPIL 2$: MOV #25,ERCOUNT ;SET UP ERROR COUNT MOV #25252,WORK1 ;GOOD DATA MOV -(R1),WORK ER25: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR.3777 OF TRACK 0 **** ;****WRD2=THE DATA THAT WAS READ FROM ADDR. 3777 OF TRACK 0 **** BR XSPIRL MOV #1,TRACK MOV #100,WRDCT MOV #INBUF,BUF CLR DMA READ ;READ DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSER TO BE CONVERTED ;ADDR BYTE=LSB OF WHERE ASCII IS GOING ;ASCII#=THE NUMBER OF ASCII CHAR. TO BE CONVERTED ; ; CONV: MOV @(5)+,ACNVX ;VALUE OF # TO BE CONVERTED MOV (5)+,%1 ;ASCII ADDR MOV (5)+,%2 ;# OF ASCII CHAR ADD %2,%1 ACVN: MOV ACNVX,%3 BIC #177770,%3 ;ISOLATE LEAST SIGNIFICANT OCTAL# ADD #60,%3 ;SET UP ASCII# MOVB %3,-(1) ;STORE ASCII CHAR BIC #7,ACNVX ROR ACNVX ;ROTATE OCTAL# ROR ACNVX ROR ACNVX DEC %2 ;-1 FROM ASCII CHAR COUNT BNE ACVN RTS %5 ;EXIT # CONVERR PC,GETPCR ;GET PC AS OFFSET FROM RELOCATABLE ZERO NEG R4 ADD (R1)+,R4 ;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 NVERSION MOV #ERRMSG,TTYBUF ;INIT FOR PRINTING ERROR MESSAGE MOV #TTYLST,-(SP) EMT TTYOUT ;REQUEST MESSAGE JSR R5,REGPOP ;RESTORE AND SET CODES WITH R4 BPL ERRP10 ;ERROR # DID NOT REQUEST RETURN RTS PC ;RETURN REQUESTED ERRP10: JMP LODL28 ;EXIT VIA "CLOSE" SEQUENCE ;******* .PAGE Y TST @DCS ;TEST FOR ERROR BPL X4SPIL ;BRANCH IF NO ERROR MOV #26,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTROL REG. ER26: JSR %5,STAER ;REPORT ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR XSPIRL X4SPIL: MOV #100,R0 MOV #INBUF,BUF 1$: CMP #25252,(R1)+ BNE 2$ SOB R0,1$ BR LPXSPIL ; BR IF ALL DATA OK 2$: MOV #27,ERCOUNT ;SET UP ERROR COUNT MOV #25TED ACNVX: 0 ;WORK REGISTER ; ; ; ; ;ROUTINE TO HANDLE KEYBOARD CONVERSATION ;ROUTINE ACCEPTS NUM. OR ALPHA CHARACTERS ; NOCHA: MOV #40,TSTCH ;SET UP FOR NUM. CHAR. BR TYST ALPHA: MOV #100,TSTCH ;SET UP FOR ALPHA CHAR TYST: MOV #340,@CSR ;LOCK UP INTERRUPTS CLR TEXBUF ;CLEAR TEXT BUFFER REG TSTFLG: TSTB @TKS ;CHECK FOR FLAG BPL TSTFLG ; MOV @TKB,@TPB ;CHARACTER IN BUFFER TSTB @TPS ;ECHO CHARACTER BPL .-4 CMP #377,@TKB ;CHECK FOR RUB-OUT BNE CKCH ;EXIT IF NOT RUB-OUT EM ;GET PC AS OFFSET FROM RELOCATABLE ZERO MOV R4,R5 ;SAVE IT MOV R1,R4 ;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  ;******* .BLKW 100 ;PATCH AREA ;******* ;******* .BOUND ; ******** TTYLST: .WORD 1 ;TELETYPE I/O LIST .BYTE 0,2 ;DEVICE: TTY #1; CALL TYPE: SUSPEND .WORD 0 ;I/O COMPLETE .BYTE 0,0 ;ERROR,L252,WORK1 ;GOOD DATA MOV -(R1),WORK ER27: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR. 0 OF TRACK 1 **** ;****WRD2=THE DATA THAT WAS READ FROM ADDR. 0 OF TRACK 1 **** X5SPIL: JMP XSPIRL LPXSPIL:BIT #BIT11,@SR ;LOOP ON TEST? BNE X5SPIL .PAGE CLRREG: CLR DMA ;CLEAR WORD ADDRESS CLR TRACK ;CLEAR TRACK ADDRESS ; ; DATAT: MOV SWRDCT,WRDCT MOV #LDAT,HRDER ;SETUP FOR HARD ERROR MOV #340,@CSR ;LOCK UP PROCESSOR PRIORITY JSR %5,PAT +1 MES8 ;REPORT RUB-OUT ACKNOWLEDGED BIC #7,TEXBUF ROR TEXBUF ROR TEXBUF ROR TEXBUF BR TSTFLG ;GO WAIT FOR NEW CHAR. CKCH: CMP #215,@TKB ;CHECK FOR CARRIAGE RETURN BNE .+4 RTS %7 ;EXIT DELIMITER TYPED BIT TSTCH,@TKB BNE CHOK EMT +1 ;REPORT QUESTION MARK MES7 BR TSTFLG ;WAIT FOR CORRECT CHAR. CHOK: MOV @TKB,WORK BIC #177770,WORK CLC ROL TEXBUF CLC ROL TEXBUF CLC ROL TEXBUF ADD WORK,TEXBUF ;ADD CHARACTER BR TSTFLG ;WAIT FOR NEW CHARACTER TEXBUF: 0 TSTLODJ38: CMD5: ;GLOBAL ADDITIVE RELOCATION: ;PUT SUM OF CONSTANT & GLOBAL (OFFSET::0) INTO TEXT; ;"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 EVEL .WORD 0,0 ;RESERVED TTYBUF: .WORD 0 ;DATA BUFFER .WORD 0,0 ; ******** ; ******************************************************************** .BOUND ; ******** OBJLST: .WORD 1 ;OBJECT MODULE READ LIST .BYTE 1,2 ;DISC: SUSPEND .WORD 0 .BYTE 0,3 ;ERR TASK, DISC SEL ;SET UP DATA BUFFERS LDAT: JSR %5,OPDSEL ;SET UP DISK ADDRESS BIT #BIT14,FLAG ;TEST FOR WRITE BEQ SLH ;TEST FOR WRITE CHECK MOV #OUTBUF,BUF ;SETUP OUTPUT BUFFER WRITE +100 ;WRITE WITH INT. ENABLED BIT #BIT9,@SR ;FIND OUT HOW TO WAIT FOR INT BNE WRWAIT ;WAIT WITH WAIT INSTRUCTION IOT ;WAIT IN BACKGROUND TEST BR SLH WRWAIT: MOV PRIORITY,@CSR WAIT ;WAIT FOR FLAG SLH: BIT #BIT13,FLAG ;TEST FOR WRITE CHECK BEQ ESH ;TEST FOR READ MOV #OUTBUF,BUF ;SETUP OUTPUT BUFFER MOV #CH: 0 ; ; ; ; ; ;ERROR MESSAGE HEADERS ; .EVEN HED1: .ASCII /%DATA ERR @/ ; ; HED2: .ASCII /%STATUS ERR @/ ; ; HED3: .ASCII /%EXTRA BKS @/ ; HED4: .ASCII /%DK ADDR ERR @/ ; ; HED5A: .ASCII /%@/ ; ; HED5: .ASCII / ERR CNT @/ ; ; HED6: .ASCII /%RANEX ERR @/ ; ; ;MESSAGE TRAILERS ; ; MES1: .ASCII / DAR @/ ; ; ; MES1A: .ASCII / DAE @/ ; ; ; MES2: .ASCII / DCS @/ ; MES2A: .ASCII / HRD ERR@/ ; ; MES3: .ASCII / WRD CNT@/ ; ; ; MES4: . ;BC BR LODJ99 ;NEXT RLD LODJ40: CMD6: ;GLOBAL ADDITIVE DISPLACED: ;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 IREQUEST PRIORITY OBJERR: .WORD 0,0 ;ERROR WORD, RESERVED .WORD OBJHED ;DATA BUFFER .WORD 0,0 ; ******** ; ******************************************************************* .BOUND ; ******** MAPLST: .WORD 1 ;LIST FOR LOAD MAP .BYTE 3,2 ;LINE PRINTER,SUSPEND .WORD 0 ;I/O COMPL340,@CSR WRCHECK +100 ;WRITE CHECK WITH INT. ENABLE BIT #BIT9,@SR ;FINDOUT HOW TO WAIT FOR INT. BNE WCWAIT ;WAIT WITH WAIT INSTRUCTION IOT ;WAIT IN BACKGROUND TEST BR ESH WCWAIT: MOV PRIORITY,@CSR WAIT ;WAIT FOR FLAG ESH: BIT #BIT12,FLAG ;TEST FOR READ BEQ REH ;CHECK BUFFER MOV #INBUF,BUF ;SETUP OUTPUT BUFFER BIC #3,FLAG ;CLEAR RE-READ COUNT DSKRD: MOV #340,@CSR JSR %5,ZBUF ;CLEAR BUFFER INC FLAG READ +100 ;READ + INT ENABLE BIT #BIT9,@SR ;FIND OUT HOW TO WAIT FOR ASCII / WRD ADDR.@/ ; ; ; MES5: .ASCII / GD DATA @/ ; ; ; MES6: .ASCII / BD DATA @/ ; ; ;M0: MES7: .ASCII /?@/ ; ; ; ; MES8: .ASCII '/@' ; ; MES10: .ASCII / WRD1 @/ ; ; MES10A: .ASCII / WRD2 @/ ; MES11: .ASCII /%UNIT NO.@/ ; ; MES12: .ASCII / @/ ; ; MES13: .ASCII / READ @/ ; ; TIMO: .ASCII /%CPU BKGRND TIMED OUT@/ ; ; OK: .ASCII /%OK!@/ ;CONVERSATION TEXT ; ; CON1: .ASCII /%DATA TEST ONLY? @/ ; ; ; CON2: .ASCII /%MULTI DK MON LSD CMP (R1)+,(R1)+ ;BUMP PAST NAME TO CONST ADD (R1)+,R4 ;C+XSYM 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 .PAGE ;******* LODJ42: CMD7: ;SET CURRENT PC AND POINT TO NEW SETE .BYTE 0,0 ;ERROR,LEVEL .WORD 0,0 ;RESERVED MAPBUF: .WORD 0 ;DATA BUFFER: CHOSEN DURING RUN .WORD 0,0 ; ******** ; ******************************************************************* .BOUND ; ******** TXTLST: .WORD 1 ;LIST FOR TRANSFERS TO/FROM TEXT AREA .BYTE 1,2 ;DISINT. BNE RDWAIT ;WAIT WITH WAIT INSTRUCTION IOT BR ELH RDWAIT: MOV PRIORITY,@CSR ;SET UP PRIORITY WAIT ;WAIT FOR FLAG ELH: BIT #BIT12,@SR BNE ADRD JSR %5,COMPARE ;COMPARE OUTBUFFER TO INBUFFER ADRD: JSR %5,OVRFLO ;TEST FOR EXTRA DATE BREAKS MOV FLAG,WORK ;CHECK DISK RE-READ COUNT BIC #177774,WORK ;DO 3 RE-READS. CMP #3,WORK BNE DSKRD ;DO ANOTHER RE-READ REH: BIT #BIT8,@SR BNE DATAT JSR %7,DISBUF ;GO SET UP DISK BUFFER. BR LDAT MSTR: TST FLAG BPL .+6 ;UNDER PROGRAM CONDE?@/ ; ; CON3: .ASCII /%# OF DKS 1 TO 10 OCTAL?@/ ; ; CON4: .ASCII /%EX. DK?@/ ; ; CON5: .ASCII /%OPT WRD CNT? @/ ; ; CON6: .ASCII /%LENGTH (1 TO 1000)?@/ ; ; CON7: .ASCII /%WRD ADDR?@/ ; ; CON8: .ASCII /%OPT. DATA PAT. #?@/ ; ; CON9: .ASCII /%WRITE?@/ ; ; CON10: .ASCII /%WRITE CHECK?@/ ; ; CON11: .ASCII /%READ?@/ ; ; ; END: .ASCII /%END@/ .EVEN ; ; ; ; .MACR OUTPUT N 0 ;OUTPUT DATA WORD N (DATA WRITTEN) .ENDM N=0 OUTBUF: .REPT 1000 OUTPUT \N N=N+1 ECTION ;IF .ASECT, THE CONSTANT WILL BE THE NEW PC, AND ITS ;BASE WILL BE ZERO. ;IF .CSECT, THE CONSTANT WILL REPRESENT THE OFFSET FROM ;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 C; SUSPEND .WORD 0 .BYTE 0,3 ;ERROR,LEVEL TXTERR: .WORD 0,0 ;ERROR WORD,RESERVED .WORD TXTHED ;ALWAYS R/W FROM/TO TEXT AREA .WORD 0,0 ; ******** .PAGE .BOUND ; ******** TRALST: .WORD 1 ;LIST FOR TRAILER .BYTE 1,2 ;DISC,SUSPEND .WORD 0 .BYTTROL JMP EXTPP ;OPERATOR SELECTED PATTERN ADD #2,PATNU ;INC PATTERN INDEX CMP #44,PATNU BNE DATAT ;NOT LAST PATTERN EXIT CLR PATNU ;LAST PATTERN EXIT ; ;THIS IS A RANDOM DATA, RANDOM ADDRESS ;AND RANDOM WORD COUNT ; ;WORD COUNT CAN BE EQUAL TO OR LESS THAN 1000 WORDS ; RANEX: MOV #-1000,PASSC MOV #1000,%6 BIC #BIT9,FLAG MOV #RANER,HRDER ;SET UP FOR HARD ERROR MOV PRIORITY,@CSR ;SET PRIORITY TO LEVEL 5 WRLG: MOV #3,WORK ;GENERATE RANDOM WORD MOV #OUTBUF,%1 JSR %5,RANDOM .ENDR .MACR INPUT N 0 ;INPUT DATA WORD N (DATA READ) .ENDM N=0 INBUF: .REPT 1000 INPUT \N N=N+1 .ENDR .END LSD... MOV R4,R5 ;...ALSO CURRENT PTR SUB #4,R0 ;BC (MORE BELOW) CLR ASWICH ;"ASECT" SWITCH: PREPARE CMP 4(R5),#410 ;IS THIS AN "ASECT"? BNE LODJ45 ;NO: GO CHECK CSECT NAMETO SEE IF HEADER;******* INC ASWICH ;SET TO FORCE IGNORE OF ALL "ASECT" TEXT ; CONTINUE AS IN "CMD8" LODJ44: CMD8: ;MODIFICATION TO PC: ".=.+C" ;BUMP PC BY ADDING NEW CONST TO CUE 0,3 ;ERROR;LEVEL TRAERR: .WORD 0,0 ;ERROR WORD,RESERVED .WORD TRAHED ;DATA BUFFER .WORD 0,0 ; ******** ; ******************************************************************* ; "BFUP" LIST BFBLK1: .WORD 0 ;ERROR WORD .WORD 0 ;FILE # BFNAME: .WORD 0,0 BFSTAT: .BYTE 0 ;ELEMENT STATUS BFTYPE: .BYTE 0 ;ELE BIC #177000,OUTBUF ;MASK FOR WORD LENGTH=1K BEQ WRLG MOV OUTBUF,WRDCT ;SET UP WORD COUNT MOV OUTBUF+2,DMA ;SET UP DAR ADD WRDCT,DMA BCS WRLG MOV OUTBUF+2,DMA BIC #177774,OUTBUF+4 MOV OUTBUF+4,TRACK ;SET UP DAE MOV WRDCT,WORK ;GENERATE RANDOM MOV #OUTBUF,%1 ;DATA BUFFER JSR %5,RANDOM MOV #OUTBUF,BUF BIS #BIT8,@DCS ;CLEAR THE DISK WRITE +100 ;WRITE DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK +100 ;WRITE CHECK DATA BIT #BIT9,@SR BNE  CMP #LWCRD,R1 ; IS CARD BUFFER EMPTY BEQ GWD3 ; BR IF AT END MOVB (R1)+,R4 ; GET CHARACTER CMP R4,#SPAC ; SPACE ? BEQ GWD1 ; YES BRANCH CLR R3 ; R3 = 0 CMP R4,#EQSN ; = ? BEQ GWEX ; YES INC R3 ; R3 = 1 CMP R4,#SCOL ; ; ? BEQ GWEX ; YES INC R3 RRENT PGM SECT BASE MOV BASE(R5),R4 ;CURRENT SECTION'S BASE ADD (R1)+,R4 ;ADD CONSTANT TO BASE VALUE ADD DSPLCE,R4 ;MAINTAIN PROPER OFFSET FROM MODULE BGN ;******* 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 CMENT TYPE BFSECT: .WORD 0 ;ELEMENT START SECTOR (FILE RELATIVE) BFSIZE: .WORD 0 ;ELEMENT LENGTH (# OF SECTORS) ; ******************************************************************* .BOUND ; ******** DFLIST: .WORD 1 ;"DEFINE FILE" LIST .BYTE 0,0 ;ERROR,ERRTSK .WORD 0 ;IFD: RETURNED IF CORE DIRECTORY .WORD 0 ;FIL.+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT MOV #INBUF,BUF ;SET UP BUFFER JSR %5,ZBUF ;CLEAR BUFFER AREA READ +100 ;READ DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %5,COMPARE ;COMPARE OUT BUFFER TO IN BUFFER JSR %5,OVRFLO ;TEST FOR EXTRA DATA BREAKS RANER: BIT #BIT9,FLAG ;CHECK FOR ERROR BEQ EXRAX BIC #BIT9,FLAG JSR %5,CONV DMA MES1 6 JSR %5,CONV TRACK MES1A 2 JSR %5,CONV WRDCT MES3 4 EMT+0 HED6 MES1A MES1 MES3 -1 ; R3 = 2 CMP R4,#COMA ; , ? BEQ GWEX ; YES INC R3 ; R3 = 3 CMP R4,#RPAR ; ) ? BNE GWD7 ; NO GWEX: MOV (SP)+,R4 MOV (SP)+,R2 RTS PC GWD7: MOVB R4,(R2)+ ; NO, PLACE CHARACTER IN TEMB CMP #LWASC,R2 ; COMPAIR CHAR POINTER WITH END OF TABLE BNE GWD1 ; NO MOV #113,R3 ; LOAD ERROR CODE OMMANDS 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 LODJ99 ;YES: O.K. CMPB #PCMD2,(R1) ;IS IT "PC MODIFICATION"? BEQ LODJ99 ;YES: O.K. BR LDER24 ;PC COMMAND NOT LAST IN RLD ;******* LODJ45: ;TE I.D. .WORD 0 ;FILE TYPE .WORD 0 ;# SECTORS IN FILE ; ******************************************************************** .PAGE TXTHED: ;HEADER FOR TEXT SAVE BUFFER READ/WRITE OPERATIONS .WORD BTCHID ;FILE I.D. FOR BATCH FILE .BYTE 0 ;RELATIVE SECTOR TXTR.W: .BYTE 0 ;TEXT READ/WRITE BYTE .WORD 0,0,0 TXTSEC: .WORD 0 ;RELATIVE SECTOR TO READEXRAX: INC PASSC ;HAVE WE DONE IT 1000 TIMES BNE WRLG ;BRANCH IF NO BIT #BIT11,@SR ;LOOP ON TEST BEQ .+6 ;BRANCH IF YES JMP RANEX ; ;CHECK FOR MULTI DISK MODE ;IF IN MULTI DISK MODE REPORT "END" ;IF LAST DISK ON SYSTEM HAS BEEN ;EXERCISED. ; ; CLR DMA CLR TRACK BIT #BIT11,FLAG ;ARE WE IN MULTI DISK MODE BEQ REPOEN ;REPORT "END" MOV FLAG,WORK ;WHAT DISK ARE WE ON BIC #177743,WORK ;IF LAST DISK ON SYSTEM CMP WORK,DSKNOR ;REPORT END BEQ REPOEN ;REPORT "END" LAST DISK AD BR GWDER GWD3: ; INSERT ROS CARD READ COMMAND MOV #FWCRD,R1 ; RESET CHARACTER POINTER CMP @R1,#DOLR ; ROS 3 CONTROL CARD BNE GWD1 MOV #102,R3 ; SET ERROR CODE GWDER: JMP RLKER ; ERROR 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 NAMESHE FIRST UNNAMED CSECT THAT IS NOT ABSOLUTE IS ;******* ;CONSIDERED TO BE THE HEADER. UPON ENCOUNTERING THE FIRST NAMED;******* ;CSECT THAT IS NOT ABSOLUTE, "CURPC" MUST BE CORRECTED FOR NOT ;******* ;ONLY THE THREE WORDS PRECEEDING THE HEADER, BUT FOR THE HEADER ;******* ;ITSELF, SINCE THE FIRST CSECT BEYOND THE FIRST 100 BYTES IS ;******* ;RELOCATED BACK TO ZERO. "CURPC" IS AN ABSOLUTE PHYSICAL ;******* ;OFFSET FROM LOAD MODULE ZER/WRIOTE TEXT TXTCNT: .WORD 0 ;# WORDS TO TRANSFER EACH TIME TXTBK1: .=.+128. ;FIRST TEXT SAVE BLOCK TXTBK2: .=.+128. ;SECOND TEXT SAVE BLOCK ; ******************************************************************** OBJHED: ;HEADER FOR READING OBJECT MODULES .WORD BTCHID ;FILE I.D. FOR BATCH FILE .BYTE 0 ;RELATIVE SECTOR .BYTE 0 ;READ/WRITE FLAG .WORD 0,0,0 OBD #4,FLAG ;INC. DISK NO. BR EXTPP ;EXERCISE DISK REPOEN: EMT +1 END ;REPORT END OF PASS BIC #34,FLAG EXTPP: JMP ADTST ;RECYCLE ; ;ENTER DISK HANDLER BY THE TRAP INSTRUCTION ;ARGUMENT TO TRAP INSTRUCTION IS TWO ORDER ;BYTE OF THE CONTROL REGISTER. ; DISK: MOV R5,-(SP) MOV R1,-(SP) MOV R0,-(SP) MOV TRACK,R0 BIC #177000,R0 ASH #6,R0 MOV DMA,R1 BIC #177700,R1 ADD R1,R0 MO 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 LODA10: 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 R2O, AND MUST NOT BE FOOLED BY THE ;******* ;DUAL RELOCATABLE ZEROES. ;******* MOV (R5),R4 ;FIRST HALF OF NAME ;******* BIS 2(R5),R4 ;2ND HALF ;******* BEQ LODJ44 ;AN UNNAMED CSECT ;******* MOV #LDBYTS+HEDSIZ,DSPLCE ;ADJUST FOR RESET OF RELOC ZERO ;******* BR LODJ44 JSEC: .WORD 0 ;RELATIVE SECTOR NUMBER .WORD 128. ;ALWAYS READ IN TWO SECTORS OBJBK1: .=.+128. ;FIRST BLOCK FOR OBJECT DATA OBJBK2: .=.+128. ;SECOND BLOCK FOR OBJECT DATA ; ******************************************************************** TRAHED: ;HEADER FOR TRAILER WRITES .WORD BTCHID ;FILE I.D. FOR BATCH FILE .BYTE 0 TRAR.W: .BYTE 1 ;ALWAYS WRITE FROM TRAILER AREV R0,(R5) ; LOAD DAR MOV BUF,-(R5) ; LOAD CMA MOV WRDCT,-(R5) ; LOAD WC NEG (R5) MOV (6),%4 MOV -(4),WORK ; BIC #177600,WORK ;MASK FUNCTION BITS MOV WORK,-(5) ;LOAD FUNCTION REG. MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R5 RTI ;RETURN FROM TRAP ; ; ; ; ; ; ; ;RF11 DISK INTERRUPT HANDLER ;ROUTINE CONTINUES ON ERRORS ; DKINT: BIC #BIT4,@CSR ;CLEAR TRACE BIT TST @DCS ;TEST FOR ERROR BPL ;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 FULL? (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)  ;******* .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 ABOVE PROGRAM JSR PC,ADDPUT ;STICK IT IN,TOO, WITH TRAILER "ADD" BR LODJ99 ; ************************************************************A .WORD 0,0,0 TRASEC: .WORD 0 ;TRAILER SECTOR NUMBER .WORD 64. ;WRITE ONE SECTOR AT A TIME TRAILBLOCK: .=.+128. ;TRAILER BUILD AREA: OUTPUT WHEN FULL .PAGE IDMSG: IDEND-.-4 ;# CHARS IN I.D. MESSAGE .WORD 0 .BYTE CR .ASCII "ROSLOD IIA" .BYTE CR,'# IDEND: .EVEN ; ******************************************************************** ND1MSG: ND1END-.-4  INTEXT ;BRANCH IF NO ERROR BIS #BIT9,FLAG ;SET ERROR BIT MOV @DAE,WORK ;REPORT ERROR BIC #177700,WORK ;MASK ADDRESS EXT. BITS. JSR %5,CONV ;CONVERT TO ASCII WORK MES1A 2 EMT+1 HED2 MOV @DCS,WORK ;TEST FOR READ BIC #177770,WORK CMP #4,WORK BNE DELMES ;IF READING REPORT WHICH READ MOV FLAG,WORK BIC #177774,WORK JSR %5,CONV WORK MES13 1 EMT+1 MES13 DELMES: MOV @DAR,WORK ;SET UP LOWER 16 BITS OF ADDR. DEC WORK JSR %5,CONV ;CONVERT TO ASCII WORK MES1  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 (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: ******* 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 TASK TABLES; EXIT. MOV #64.,TXTCNT ;WANT TO WRITE ONLY ONE SECTOR MOVB #1,TXTR.W ;WRITE JSR PC,TEXTIO ;GO READ O ;# CHARS IN "END 1" MESSAGE .WORD 0 .BYTE CR .ASCII "ROSLOD PASS #1 END" .BYTE CR ND1END: .EVEN ; ******************************************************************** PAS2MG: PAS2ND-.-4 ;# CHARS IN "PASS 2" MESSAGE .WORD 0 .BYTE CR .ASCII "ROSLOD PASS #2 BEGIN" .BYTE CR PAS2ND: .EVEN ; ********************************************************************  6 EMT+0 MES1A MES1 -1 MOV @DCS,WORK ;SET UP STATUS JSR %5,CONV WORK MES2 6 EMT+1 MES2 BIT #BIT14,@DCS ;TEST FOR HARD ERROR BEQ SOFTER ;GO AND CONTINUE SOFT ERROR MOV @DAE,WORK ;FETCH ERROR EXT. BITS SWAB WORK BIC #177400,WORK JSR %5,CONV ;CONVERT TO ASCII WORK MES2A 3 EMT+0 HED5A MES2A -1 BIS #BIT8,@DCS ;CLEAR THE DISK MOV #1000,%6 BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT 10 SET IN SR JMP @HRDER ;EXIT HARD ERROR SOFTER: T ;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 ASR R1 ;#NAMES CONVERTEDTO RADIX-50 MOV R1,MODCNT ;SAVE IT: # OBJ MODULES TO LINK CLR BFSTAT ;STATUS AND TYPE: FREE AND OBJECT MODULE LODB20: DEC R1 ;# NAMES BLT LODC10 R WRITE WITH"TXTLST" MOV CURPC,R0 ;# BYTES IN PROGRAM ;******* ASR R0 ;# WORDS ADD #LEDWDS+PHDSZE,R0 ;TOTAL # WORDS FROM TOP OF 1ST PAGE ;******* CLRB R0 ;GETTING # OF PAGES SWAB R0 ;# CORE "PAGES" -1 INC R0 ;# OF CORE PAGES MOV R0,-(SP) ;SAVE FOR USE BELOW  ;******* .PAGE ERRMSG: ERNEND-.-4 ;# CHARS IN ERROR MESSAGE .WORD 0 .BYTE CR .ASCII "ERROR # " ERRNUM: .BYTE 0,0,0 .BYTE CR ERNEND: .EVEN ; ******************************************************************** HEDING: .WORD END01-4-. .WORD 0 .BYTE FF .ASCII "**** ROSLOD LOAD MAP ****" .ASCII " **** LOAD ELEMENT [" ;MUST BE EVEN # OF BYTES LODNST @WC ;CHECK FOR X-FER DONE BEQ INTEXT ;EXIT FROM ROUTINE BIT #BIT9,@SR BEQ .+6 SUB #2,(6) ;X-FER NOT DONE SET UP FOR RETURN BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT10 SET IN SR BIS #BIT0,@DCS ;SET GO AND CONTINUE RTI ;RETURN TO WAIT INSTR. ; ; INTEXT: BIT #BIT13,@SR ;HALT ON COMPLETION FLAG BEQ .+4 HALT ;YES BIT 13 SET IN SR HALT BIT #BIT9,@SR BNE .+6 MOV #774,%6 ;RESET STACK RTI ;EXIT ; ; ;ROUTINE TO SET UP DAR AND DAE ;FROM SR AND CONVER ;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 TST 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 ;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 CREATING 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" MOV #HEDBGN+24,R0 ;PTR TO "TPDR 0" AM: .WORD 0,0,0 ;LOAD ELEMENT NAME - WILL EVENTUALLY BE DYNAMIC ;*************** REMOVE THIS WHEN LOAD ELEMENT NAME IS DYNAMIC********** .=.-6 .ASCII "LODTMP" ;NAME CURRENTLY HARD-CODED ;*************** ************ .ASCII "] ****" .BYTE HT,HT MONTH: .BYTE 0,0,'/,CR DAY: .BYTE 0,0,'/,CR YEAR: .BYTE 0,0,HT,HT HOUR: .BYTE 0,0,':,CR MINUTE: .BYTE 0,0,LF,LF END01: .EVEN .PSATION ;ENTER FROM JSR %5,OPDSEL OPDSEL: BIT #BIT7,@SR ;DOES SR CONTAIN TRACK # BNE .+4 RTS %5 MOV @SR,R0 ; FETCH SW BIC #177600,R0 MOV R0,TRACK MOV #0,DMA ; USE MOV RATHER THAN CLR FOR PATCHING RTS %5 ;EXIT ; ;ROUTINE TO SETUP DISK BUFFERS ;ADD WORD COUNT TO STARTING DISK ADDRESSES ;COMPARE CALCULATED ADDRESS TO TERMINATING ADDRESS ; DISBUF: ADD WRDCT,DMA ;ADD WORD COUNT TO LOWER 16 BITS BCC COMDAR INC TRACK ;OVE ;******* 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 ;POINTER 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  ;******* MOV #8.,R1 ;******* 2$: TST (R0)+ ;******* BEQ 4$ ;IGNORE UN-INITED REGISTERS ;******* MOV 16(R0),R3 ;PICK UP CORRESPONDING TPAR ;******* ADD #HEDSIZ,R3 ;ADJUST FOR HEADER SIZE... ;******* CLR R2 ;***AGE MODULE: .WORD END03-4-. .WORD 0 .ASCII "**********" .BYTE LF .ASCII "ELEMENT TITLE: [" TITLE: .BYTE 0,0,0,0,0,0,'],LF .ASCII "SECTION" .BYTE HT,HT .ASCII "ENTRY" .BYTE HT .ASCII "OFFSET" .BYTE HT .ASCII "SIZE" .BYTE HT .ASCII "TOTAL" END03: .EVEN .PAGE SECT: .WORD END04-4-. .WORD 0 .BYTE '< SECNAM: .BYTE 0,0,RFLOW ADD ONE TO TRACK COMDAR: CMP DMA,@DAR ;COMPARE LOWER 16 BITS BEQ CMDAE BIS #BIT6,FLAG ; CMDAE: MOV @DAE,WORK1 ;FETCH EXT. ADDR BITS BIC #177740,WORK1 ;MASK TRACK AND DISK ADDR MOV FLAG,WORK ;SET UP DISK ADDRESS BIC #177743,WORK ADD TRACK,WORK BIC #177740,WORK CMP WORK,WORK1 ;ARE THEY EQUAL BNE ERADR ;ERROR IN DAE REG TSTB FLAG ;CHECK FOR LAST DISK BUFFER BPL EXTCME CLR DMA ;CLEAR LOWER 16 BITS CLR TRACK ;CLEAR EXT. ADDR. BITS. BIC #200,FLAG ADD #2,(6) ;INC STOCK .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 OBJECT 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 B**** DIV #64.,R2 ;...AND FOR KT-11C BLOCK SIZE ;******* MOV R2,16(R0) ;******* 4$: SOB R1,2$ ;******* INCB TXTR.W ;WRITE... ;******* JSR PC,TEXTIO ;...HEADER BACK OUT ;******* MOV HEDBGN+HTASK,R1 ;TASK # ;******* CMP INEG B D EN . 0 00 4 KWBL .: UFNB I ;0 00 4 KWBL .F:BUUT O ; ENEV . / D@EN/%I CIAS .D:EN ;/ ?@ADRE POINTER MOV SWRDCT,WRDCT BR EXTDR ;EXIT EXTCME: BIC #177774,WORK1 ;MASK EXT. TRACK BITS CMP #3,WORK1 ;COMPARE FOR LAST TRACK BNE AKH ;NOT LAST TRACK EXIT MOV @DAR,WORK ;FETCH LOWER 16 BITS OF ADDRESS ADD WRDCT,WORK ;WILL DISK OVERFLOW BCC AKH BIS #200,FLAG MOV @DAR,WRDCT ;DISK WILL OVERFLOW COM WRDCT ;SET UP NEW WORD COUNT INC WRDCT ;MAKE TWO'S COMP. AKH: MOV @DAE,TRACK BIC #177774,TRACK ;MASK TRACK BITS MOV @DAR,DMA ;LOWER 16 BITS OF ADDRESS BIT #BIT6,FLAG ;REPORT ADDRELOCK 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 ;IS IT MODULE END? BEQ LODC20 ;YES: GET NEXT MODULE BR LODC30 ;NO: GET NEXT BLOCK LODD10: INC BLOCK1 ;INDICATE FIRST BLOCK PROCESSED DE R1,#TASMAX ;WITHIN LIMITS? BGT LDER30 ;OUTSIDE TASK LIMITS CMP R1,#OVTMIN BLT LDER30 MOVB HEDBGN+HPRIOR,R2 ;PRIORITY CMP R2,#NPRIOR ;PRIORITY LEGAL? BGT LDER31 ;ILLEGAL PRIORITY TSTB PPTAB(R2) ;IS THIS A TIME-SLICE PRIORITY? BLE LODL04 ;NO TST HEDBGN+HMAXEQ ;YES - EXECUTION TIME MUST BE SPECIFIED BLE LDER32 LODL04: /%I CIAS .1:N1CO ;/ ?@CKHE CTERI%W /IISC.A: 10ON C; @/E?ITWR/%I CIAS .9:ON C; @/#?. AT PTADA. PT%O /IISC.A: N8CO ;/ ?@DRADD WR/%I CIAS .7:ON C; @/)?0010O T(1H GTEN%L /IISC.A: N6CO ;/ @T?CND WRT OP/%I CIAS .5:ON C; @/K? DX.%E /IISC.A: N4CO ;/ ?@ALCT O10O T 1KS DOF# /%I CIAS .3:ON C; @/E?OD MDKI LTMU/%I CIAS .2:ON C; @/? LYONT ES TTADA/%I CIAS .1:ON C; ;T EX TONTISAERNVCO ; / !@OK/%I CIAS .K: O; @/UT OEDIM TNDGRBKU CP/%I CIAS .O:IM T; @/D EA R/ I CIAS .3:S1ME ;/ @/ I CIAS .SS ERROR BNE .+4 EXTDR: RTS %7 ;EXIT ERADR: JSR %5,CONV ;CONVERT DMA REG COUNT TO ASCII DMA MES1 6 JSR %5,CONV ;CONVERT TRACK REG COUNT TO ASCII WORK1 MES1A 2 EMT +0 ;REPORT ERROR HED4 MES1A MES1 -1 BIC #BIT6,FLAG CLR DMA ;DISK ADDRESS ERROR RE-START PROG. CLR TRACK BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;SWITCH 10 SET IN SR HALT RTS %7 ; ; ; ;ROUTINE TO SELECT DATA PATTERNS FOR TEST ; ;ENTER FROM JSR %5 PASEL ; PASEL: MOV PATNU,%0 ;SET UP PATTEC (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: ;HERE 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 ;NOW CHECK FOR PROGRAM SIZE AND SET ACCORDINGLY MOV TRASEC,R0 ;# OF FINAL SECTOR WRITTEN SUB BFSECT,R0 ;GET # OF PROGRAM SECTORS - 1 BR .+4 ;DON'T COUNT 1ST TRAILER SECTOR ;******* INC R0 ;# OF SECTORS IN FINAL FILE BIT #3,R0 ;IS # OF SECTORS A MULTIPLE OF 4? BNE LODL06 ;NO INC (SP) ;YES:NEED ONE EXTRA "PAGE" FOR SPILLOVER ;...FR2:S1ME ;/ .@NOT NI%U /IISC.A: 11ES M; @/2 RD W /IISC.A: 0AS1ME ;/ @D1WR / I CIAS .0:S1ME ;' /@ 'IISC.A: S8ME ;/ ?@ /IISC.A: S7ME ;/ @TADAD B /IISC.A: S6ME ;/ @TADAD G /IISC.A: S5ME ;/ .@DRADD WR / I CIAS .4:ES M; @/NT CRD W /IISC.A: S3ME ;/ R@ERD HR / I CIAS .A:S2ME ;/ @CS D /IISC.A: S2ME ;/ @AE D /IISC.A: 1AES M; @/R DA / I CIAS .1:ES M; RSLEAITRE AGSSME ; GEPA . / @RR EEXAN%R /IISC.A: D6HE ;/ @NT CRR E / I RN NUMBER MOV WRDCT,WORK ;SET UP WORK MOV #OUTBUF,%1 ;LOC. OF OUTBUFFER CMP #42,%0 ;TEST FOR RANDOM DATA NUMBER BEQ RANDOM ;GO GENERATE RANDOM DATA FILDAT: MOV PAT0(0),(1)+ ;FILL BUFFER DEC WORK ;DEC. WORK COUNT TST WORK ;TEST FOR LAST WORK BNE FILDAT ;LOAD NEXT WORD RTS %5 ;BUFFER FULL ; ;RANDOM DATA ; ; ;RANDOM DATA GENERATOR SUBROUTINE RANDOM: MOV LONUM,%0 ;SET UP R0 WITH 5 DIGITS LOW MOV HINUM,%4 ;SET UP R1 WITH 5 DIGITS HIGH MOV #7,%3 ;SET UP SHIFT COUNT CLR %2 ;C,#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 JMP @GSDTAB(R2) .PAGE GSDTAB: .WORD LODE00 ;(0) OBJ MOD NAME .WORD LODE20 ;(1) SECTION NAME .WORD LODD20 ;(2) INTERNAL SYMBOL (IGNORE) OM FINAL SECTOR, DUE TO "PHDSZE" WORDS AT BEGIN OF ALLOCATED AREA ;...WHICH ARE NOT RESIDENT ON THE DISC. 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 ;LEAVE ONLY # OF PAGES CMP (SP),R3 ;ACTUAL PROGRAM SIZE :: MAX ALLOWED BGT LDER34 ;# "PAGES" NEEDED TOO LARGE FOR PRIORITY CIAS .5:ED H; @//%I CIAS .A:D5HE ;/ @RR EDRADK %D /IISC.A: D4HE ;/ @KS BRAXT%E /IISC.A: D3HE ;/ @RR EUSATST/%I CIAS .2:ED H; @/R ERA AT%D /IISC.A: D1HE ;S ERADHEE AGSSMER ROER ;; RNTURE; PC S RT $ ,2R1 B SO + 0)(R T TS )+R2,(R0 V MO : 2$ SSREDD AERSTGIRET RSFI; 2 ,RCS#D V MO S ERSTGIREF OERMBNU; R10,#1 V MO R00,3065#1 D AD 20Y BLTMU; 0 ,R#4 H AS 7RUTH0 LEAR R2 SHIFT: ASL %0 ;SHIFT R0 LEFT AND ROL %4 ;ROTATE CARRY INTO LSB OF R1 INTO ROL %2 ;ROTATE CARRY OUT OF R1 INTO R2 DEC %3 ;DECREMENT R3 BNE SHIFT ;CONTINUE SHIFT LOOP ADD LONUM,%0 ;ADDN IN NUMBER TO MAKE X 129 ADC %4 ;PROPOGATE CARRY ADD HINUM,%4 ;ADDN IN NUMBER TO MAKE X 129 ADC %2 ;PROPOGATE CARRY ADD #1057,%0 ;ADDN LOW CONSTANT ADC %4 ;PROPOGATE CARRIES ADC %2 ;PROPOGATE AGAN ADD #47401,%4 ;ADDN HIGH CONSTANT ADC %2 ;PROPOGATE CARRY ADD #6,%2 ;ADDN HIGHEST  .WORD LODD20 ;(3) TRANSFER ADDRESS (IGNORE) .WORD LODE40 ;(4) GLOBAL SYMBOL ; ******************************************************************** LDER13: MOV #13,R4 ;FIRST MODULE BLOCK NOT "GSD" JSR PC,ERRPRT LDER14: MOV #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  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+HEDSIZ,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,DFLISERMBNUV DE; R00,7777#1 C BI: EGTRSE ; G REET,SPC R JS D AN R0N IERMBNUK IS DALICOG LCELA P E;AGUS ; RSTEISEG RGEPAE ICEV DC D D E THP UTSSEE INUTROS HI T; ;0 : CHST T0 : UFXBTE ERCTRAHA CEW NOR FITWA ;G FLST TBR R TEACARCHD AD ;UFXBTEK,OR WDD A UFXBTEL RO C CL F BUEX TOL R LC C UFXBTEL RO C CL K OR,W707717 #IC B RKWOB,TK @OV MK:HO C. ARCHT ECRRCOR FOT AI;W LGTFTSR B S7ME K AR MONTIESQUT OREP;R +1T EM K HO CNE B KB@TH,TCTST BI D PETYR TEMILIDET XI;E %7S RT 4 CONSTANT ADD %2,%0 ;REPRIME R0 WITH HIGH DIGIT ADC %4 ;PROPOGATE CARRY MOV %0,LONUM ;PUT R0 BACK IN LONUM MOV %0,(1)+ ;HOLD LONUM FOR PROGRAM DEC WORK BEQ EXGEN MOV %4,HINUM ;PUT R1 BACK IN HINUM MOV %4,(1)+ ;HOLD HINUM FOR PROGRAM DEC WORK BNE RANDOM EXGEN: RTS %5 ;RETURN T PROGRAM LONUM: 0 HINUM: 0 ; ; .EVEN ; ;RF11 DATA PATTERNS ; PAT0: 0 PAT1: 177777 PAT2: 134510 PAT3: 043267 PAT4: 100000 PAT5: 107070 PAT6: 070707 PAT7: 052525 PAT10: 125252 PAT11: 1777;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 BR LDER16 ;NOT UNIQUE MOV SYME,PTROBJ ;POINTER TO NEW MODULE NAME IN LSD JSR PC,INSYME ;GO INSERT ENTRY INTO LSD BR LODD20 ; ************T+6 ;LOAD FILE I.D. INTO LIST MOV HEDBGN+HCPUST,R5;REQUESTED FILE TYPE ;******* BIC #-177-1,R5 ;SUPPRESS IFD REQUEST BIT ;******* 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. LDER34: INC R4 ;PROGRAM SIZE TOO BIG .+E BN N URET RGEIARRCAR FOK ECCH ;KB@T5,21 #MP CH:KC C. ARCHW NER FOT AI WGO ;G FLST TBR F BUEX TOR R UFXBTER RO F BUEX TOR R UFXBTE7, #IC B EDDGLEOWKNACT OUB-RUT OREP;R 8 ES M +1T EM T OUB-RUT NOF IITEX ;H KC CNE B UT-OUB ROR FCKHE;CB TK,@77#3P CM 4 .-L BP R TEACARCHO CH;E PS@TB ST T ERFFBUN IERCTRAHA;CB TP,@KB@TV MO ; LGTFTSL BP G LA FOR FCKHE;C KS@TB ST TG:FLST TG RER FEUF BXTTER EACL ;F BUEX TLR C TSUPRRTEINP UCKLO ;SR@C0,34 #OV MT:YS TR HA CHALP AOR FUPT SE ;CHST,T00#1V MO: HA37 PAT12: 004102 PAT13: 136363 PAT14: 063636 PAT15: 000001 PAT16: 100005 PAT17: 000520 PAT20: 030303 ;PAT21 RANDOM DATA ; ; ; ;DATA COMPARISON ROUTINE ;IF AN ERROR OCCURS BETWEEN THE OUT-BUFFER AND ;THE IN-BUFFER AN ERROR WILL BE REPORTED IN THE ;FOLLOWING MANNER ;DATA ERROR XX DAE XXXXXX DAR XXXXXX GOOD DATA XXXXXX BAD DATA ; ; COMPARE:CLR WORK2 ;WORD COUNT MOV #OUTBUF,SAVE ;SET UP OUTBUFFER POINTER MOV #INBUF,SAV1 ;SET UP IN BUFFER POINTER WRDCMP: CMP @SAVE,@SAV1 ;COMPARE BUFFE******************************************************** 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******** LODE20: 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 -(BFOR PRIORITY 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+HCPUST,DFLIST+8. ;LOAD FILE TYPE INTO LIST ;******* MOV R0,DFLIST+10. ;# OF SECTORS TO DEFINE LP AT YS TBR . ARCH. UM NOR FUPT SE ;CHST,T40 #OV MA:CHNO ;S ERCTRAHA CHALP AOR. UM NTSEPCC ANETIOU;R ONTISAERNVCOD ARBOEY KLENDHAO TNETIOU;R ;R TEISEG RRKWO ; 0X:NVAC EDRTVEON C #ITEX ;5 %TS R VNACE BN T UNCOR HA CIISC AOMFR1 ;- %2C DE X NVACR RO X NVACR RO # ALCT OTETARO ;X NVACR RO X NVAC7, #IC B ARCHI CIASE ORST ;) (1,-%3B OV M I#CIASP UET;S %30,#6D AD # ALCT ONTCAFINIIG SSTEA LTELASO;I3 ,%707717 #IC B %3X,NVACV MO: VNAC %12, %DD A ARCHI CIASF O;# %2+,5) (OV M DRADI CIAS ;RS BNE WDERR ;WORD IN ERROR WRDINC: INC WORK2 ;+1 WORD COUNT CMP WRDCT,WORK2 ;IS COMPLETE BUFFER CHECKED BEQ ADAM ;EXIT ROUTINE ADD #2,SAVE ADD #2,SAV1 BR WRDCMP ;COMPARE NEXT WORD ADAM: RTS %5 ;EXIT THIS ROUTINE ; WDERR: BIS #BIT9,FLAG ;SET ERROR BIT MOV DMA,WORK ;FETCH STARTING DISK ADDR MOV TRACK,WORK1 ; ADD WORK2,WORK ;CALCULATE FAILING ADDR BCC .+6 ;SHOULD DAE BE INCREMENTED INC WORK1 MOV FLAG,WORK3 BIC #177743,WORK3 BIS WORK3,WORK1 JSR %5,CONV ;CONVERT WORDYPASS 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 LODD20 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  MOV #DFLIST,-(SP) ; ******** 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 LDER1 ,%)+(5V MO D TEERNVCOE BTO# F OUEAL;VX NVAC+,5)@(V MO: NVCO ;; EDRTVEON CBEO TR.HA CIISC AOFR BEUM NHE=TI#CIAS ;G INGOS IIISC AREHE WOFB LSE=YT BDRAD ;D TEERNVCOE BTOR BEUM NOFS ESDRAD#=DRAD ;V ON,C%5SR;J WSLOOL FASE INUTROR TEEN ;; NETIOU RRTVEON CIISC ATOL TAOC ;; ;E AGSSMET EX NSSCERO PGO ;S YP TBR E ER HESGOE AGSSMEF OSSREDD;A 0 : SBYP TE AGSSMEE YP TTOB SUP TYN OLLCA ;1 +MT EA:PSTY ITEX. ORATINRMTE ; TI R R.TONAMIER TOT NIFH NCRA;B SAYP TNE B ORATINRMTER FOK ECCH ;SBYP,T-1 ADDR TO ASCII WORK MES1 6 JSR %5,CONV ;CONVERT TRACK ADDR TO ASCII WORK1 MES1A 2 MOV @SAVE,WORK ;FETCH GOOD DATA JSR %5,CONV ;CONVERT GOOD DATA TO ASCII WORK MES5 6 MOV @SAV1,WORK ;FETCH BAD DATA JSR %5,CONV ;CONVERT TO ASCII WORK MES6 6 MOV FLAG,WORK ;WHICH READ THE BIC #177774,WORK ;ERROR OCCURRED ON JSR %5,CONV WORK MES13 1 EMT +0 ;PRINT MESSAGE HED1 MES13 MES1A MES1 MES5 MES6 -1 BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES 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 ; ******************************************************************** LDER17: MOV #17,R4 ;SECTION NAME CONFLICT W/GLOBAL SYMBOL JSR PC,ERRPRT .PAGE ;*******GLOBAL SYMBOL******** (HERE AT L33 ;YES .PAGE ;*************** 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 #$BCHID,TXTHED ;SET UP READ I.D. JSR #MP C SBYP TTOE AGSSMEF OSSREDD;AB PSTY0,@%V MO S ESDRADE AGSSMET EX NTOE ATPD;U %6,@#2D AD S ESDRADE AGSSMES INTAON CATTHS ESDRADT GE ;0 ,%%6 @OV MS:YP TR TEINPRE YPETEL TONS GESAES MIISC AOFS IEER S AUTTPOUO TNETIOUBRSU ;0 : ATPDTY PATYR B R.HA CPETYO ;G PDTY7, %SR J T.DAYP TTOE OD CLFE OV;MT DAYP,T12 #VBMO: PGTY R.HA CPETYO ;G PDTY7, %SR J ATPDTYO TDECON URET RGEIARRCAE OV;MT DAYP,T15 #VBMO: PFTY ITEX ;7 %TS RT:XIYE T4 .-L BP . AGFLE ON DOR FITWA ;S TP @TBTS R TEINPRO TERCTRAHA CUTHALT BIT 10 SET IN SR BR WRDINC ;GO COMPARE NEXT WORD ; ; ; ; ; ; ; ;ROUTINE TO ZERO DATA INPUT BUFFER ;ZERO BUFFER BEFORE READING ; ; ZBUF: MOV #INBUF,%4 ;FETCH START OF INBUFFER MOV #4000,R0 1$: CLR (R4)+ SOB R0,1$ NZUF: CMP R4,#INBUF+10000 ;IS THE ROUTINE COMPLETE BNE CLEAR ;ZERO NEXT WORD RTS %5 ;EXIT ROUTINE CLEAR: CLR (4)+ ;CLEAR THE WORD BR NZUF ; ; ; ; ;ROUTINE TO TEST FOR ADDITIONAL DATA TRANSFERS ;ANY DATA TRANSFERRED A AST...) 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 ;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 REMO! PC,TEXTIO ;GO READ OR WRITE WITH"TXTLST" 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? BLT LODL30 ;MORE SECTORS TO GO ;******* MOV R1,BFSIZE ;# OF SETPOU ;PB@TT,DAYP TVBMO T XIYE TNE B SR,@14IT#BT BI: PDTY PATYR B ATPDTYN IARCHE YP;T PDTY7, %SR J #" "IFH NCRA;B PGTYQ BE . #" "OR FCKHE C"."%T NO ;ATPDTY2,#4B MP C "."%F ICHANBR ;F YP TEQ B "."%R FOK ECCH ;ATPDTY5,#4B MP CC:YP T. ITEX. NEDO. ARCHR TONAMIER;T I RT . @" "OT NIFH NCRA;C PCTYE BN R TEACARCH" "@R FOK ECCH ;ATPDTY0,10 #PBCM R TEACARCHT GE ;ATPDTY+,0) (VBMO: PATY 0. RTOE AGSSMEF OSSREDD;A %00,@%V MO . ITEXP UET;S %6,@#2D AD S ESDRADE AGSSMES INTAON CATTHS ESDRADT GE ;0 #FTER WORD COUNT OVERFLOW IS AN ERROR ; ; OVRFLO: MOV WRDCT,%4 ;ADD WORD COUNT ROL %4 ADD #INBUF,%4 CHWRD: CMP R4,#INBUF+1000 ; IS TEST COMPLETE BNE CKNEX ;CHECK NEXT WORD RTS %5 ;TEST IS COMPLETE CKNEX: TST (4)+ ;TEST FOR ZERO WORD BEQ CHWRD ;WORD IS ZERO BIS #BIT9,FLAG ;SET ERROR BIT MOV %4,ACNVX SUB #2,ACNVX JSR %5,CONV ;CONVERT 1 OCTAL TO ASCII ACNVX ;ADDRESS MES4 6 MOV %4,ACNVX SUB #2,ACNVX MOV @ACNVX,ACNVX JSR %5,CONV ;CONVERT OCTAL TO ASCII ACNVX $VAL 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 AS 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 %CTORS USED UP IN LOAD MODULE .PAGE ;************** NOW INIT ALL RELEVANT 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 ,%%6 @OV MP:TY R.TEINPRE YPETEL TONE AGSSMEI CIAST PUUT OTOE INUTROUB;S XTTEF ONELIE ONE YP TES;Y YP TBR T EX TOFS NELIF OESRISEA E YP TO!;N PSTYE BN 1 T+EML AL CHE TAS;W) (0,-+1MT#EP CM 0 ,%6) (OV MP:TREM ESIN LOFS IEER S APETY0=T+EM ;T EX TOFE IN LNE OPETY1=T+EM ;S LLCAT EME ODEC DTOE INUTRO ;; ;E INUTROT XI;E %5S RT 1 - 0AS1ME 0 S1ME 5 ED H 5AED H GESAES MRTPORE ;0 +MT E 3 GESAES MOFS ESDRAD ; D5HE D TEERNVCOE BTOT UNCOR ROER ; NTOURC E IISC ATOL TAOCT ERNVCO ;V ON,C%5R ' ;DATA MES6 6 EMT +0 ;CALL TYPE OUT ROUTINE HED3 MES4 MES6 -1 BR CHWRD ;FETCH NEXT WORD ; ; ;EXTENDED MEMORY EXERCISER ;THE PROGRAM DETERMINES HOW MUCH MEMORY ;IS ON THE SYSTEM THEN IT ;GENERATES A RANDOM BUFFER THAT SIZE ;AND WRITES AND WRITE CHECKS THE DATA ; EXTMEN: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PRIORITY LEVELS MOV #1000,%6 MOV #MAXREF,4 ;SET UP I/O BUS TRAP MOV #340,6 MOV #17446,SAVE ;SET UP FOR 4K EXREF: TST @SAVE ;REFERENCE MEMORY ( 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 DIRECTORY ; (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 )FILE I.D. TSTB DFLIST+8. ;WAS AN IFD REQUESTED? BPL 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 JS 6 E AGSSMEF OSSREDD;A A 10ES M RTVEON CBEO TTADA ; K1OR W IISC ATOL TAOCT ERNVCO ;V ON,C%5R JS 6 E AGSSMEF OSSREDD;A 0 S1ME D TEERNVCOE BTOA AT;D K OR W IISC ATOL TAOCT ERNVCO ;V ON,C%5R JS: R1AEST ;; ;S ERSTGIREO TWF OTSENNTCOE THD ANT UNCOR ROERT OREP RTOE INUTRO ;; NETIOU RITEX ;5 %TS R -1 0 S1ME 5 ED H 5AED H GESAES MRTPORE ;0 +MT E 3 GESAES MOFS ESDRAD ; D5HE D TEERNVCOE BTOT UNCOR ROER ; NTOURC E IISC ATOL TAOCT ERNVCO ;V ON,C%5R JS 6 E AGSSMEF OSSREDD+CMP #177446,SAVE ;TEST FOR GREATER THAN 28K BNE .+6 ;BRANCH IF LESS THAN 32K HALT BR MAXREF ;LAST REFERENCE MADE TO I/O REG. ADD #20000,SAVE ;SET UP FOR NEXT MEMORY REF. BR EXREF ;GO REFERENCE MEMORY ; ;ENTER HERE WHEN I/O BUS ERROR OCCURS ; MAXREF: MOV #6,4 ;RESTORE I/O BUS TRAP CLR 6 MOV #1000,%6 SUB #20000,SAVE ; SUB #OUTBUF,SAVE ;SET UP NEW WORD COUNT MOV SAVE,SWRDCT ROR SWRDCT MOV SWRDCT,WRDCT MOV #BIT7,@CSR ;SET UP PRIORITY LEVEL MOV #NEWBUF,HRDER ;SET UP FOR HARD,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 ; 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 SY-LODL26 MOV R1,TASKS LODL26: MOV #$TKFLS,-(SP) ;MUST WRITE 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 MO;A 0 S1ME D TEERNVCOE BTOA AT;D K OR W IISC ATOL TAOCT ERNVCO ;V ON,C%5R JS: ERTA S; ERSTGIREE ONF OTSENNTCOD ANT UNCOR ROERT OREP RTOE INUTRO ;; ;; ;; ;; EDNGHA COT NAS HSR ;G CHSRR B EDNGHA CAS HSR ;P AMSTE BN R @S1,RKWOP CM: HGRC SY ADRET NOL RONTCOR FOT AI;W SYBUCTL BP Y ADRET NOL RONTCOR FOT ES;T CS@DB ST TY:USTB CD EA RND AGO ;S DC,@#5S BI T UNCOD OR WADLO ;WC,@777717 #OV M SSREDD ANTREUR CADLO ;MA@CF,BUIN #OV M EDADLOG RES ESDRADK IS;DR DA,@RKWOV MO K OR,W7737 #IC B / ERROR CLR DMA CLR TRACK NEWBUF: MOV WRDCT,WORK ;SET UP FOR RANDOM BUFFER MOV #OUTBUF,%1 JSR %5,RANDOM ;NEW DATA BUFFER GENERATED MOV #OUTBUF,BUF WRITE+100 ;WRITE BUFFER BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK+100 ;WRITE CHECK DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR NEWBUF ;GO WRITE NEW BUFFER BR NEWBUF-10 ;DISK COMPLETE START AGAIN ; ;BACKGROUND TEST FOR INTERRUPTS 0MBOL 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,UNSQUISH ;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*4001DULE FIRST, THEN OBJ MODS CLR BFSTAT ;TYPE = OBJECT MODULE 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 JMP LODA00 ;BACK TO BEGIN ;******* .PAGE ;******* BSZTAB: ;TABLE OF MAX RKWOL RO K OR WOL R RKWOL RO K OR WABSW K OR,WSR @OV M EDADLO. EG RR.DD AT.EXK IS;DE DA,@RKWOV MO K OR WOR R RKWOR RO K OR WOR R RKWOR RO K OR WOR R O. NSKDID ANK ACTRE THK AS;MK OR,W006017 #IC B RKWO1,RKWOV MO R SCHET;F1 RKWOR,@SV MO S DC,@T8BI #IS BP:AMST ;R BEUM NSKDIE THS ALQU E-7R9;S ERMBNUK ACTRE THS ALQU E-0R6;S METIY ANT AERSTGIREH TCWI SHE TGEANCHY MAR TORAPE OHE;T CKRA THE TCTLESEO TADRED OR WNE O AESDOE INUTROE TH ;Y CLTITA SCKRA T ACTLESEO TORATEROPE THS LEABENE INUTROS 3 ; XWAIT: MOV #RTIX,14 ;SET UP TRACE TRAP CLR 16 MOV #-1000,PASS ;SET UP TIME BASE BIS #BIT4,@CSR ;SET TRACE BIT CLR #0 XINCW: INC XINCW-2 TSTB XINCW-2 BPL XINCW INC PASS BEQ .+4 BR XINCW-4 ;REPORT BACKGROUND TEST TIMED OUT MOV #340,@CSR BIC #BIT4,@CSR ;CLEAR TRACE BIT EMT+1 TIMO HALT ; RTIX: RTI ;RF11 POWER FAIL TEST "1 ; DISK ZERO ; WRITE COMPLETE DISK WITH 125252 PATTERN ; REPORT "OK" ;START WRITING THE SAME PATTERN ;WHEN POWER FAIL OCCURS ABORT TRANSFER ;SETU4+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: ADD #BPSYM,R4 ;GET TO NEXT UNDEFINED LODF03: CMP R4,USYME ;EXHAUSTED UNDEFINEDS? BEQ LODF09 ;YES MOV R2,R3 ;INIT TEMP PTR TO MONITOR SYMBOLS LODF045ALLOWABLE BLOCK OR "PAGE" SIZES ; 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!$PS0HI;T ; ; ;; ;; ;; CRW NET ECEL SSYBUT NOK IS;D CSLDSER B DYEA RLLTI SSKDI ;Y USKB DPL B DYEA ROT NSKDIR FOT ES;T CS@DB ST TY:USKB DT SET NOS IT BONTINCFU ;S DCEL SEQ B ET STSBIN IOCTUN FIS ;CS@D0,IT#BT BI G REL RONTCOO NT ISRV MO ;CS@DR,@SV MO S ESDRADT ENRRCUP UET;SA CM,@UFTBOU #OV M RDWO1 -NTOU CRDWOT SE ;WC,@777717 #OV M TSUPRRTEINP UCKLO ;SR@C0,34 #OV MS:DCEL SR TEISEG RUSATSTL RONTCOK IS;D ;; 0ERSTGIREO NT;I LKOV MBR T SERE T SERE D EAAHK OO LVEMO ;0 ,%DS@AV MO: LK7P NEW ENTRY POINT AND HALT ; ;POWER UP AND WRITE CHECK THE DISK FOR ERRORS ; ;***ONLY ONE ERROR IS CONSIDERED ACCEPTABLE*** ; ; PFT1: MOV #1000,%6 ;SET UP STACK JSR %7,POWFAL ;WRITE 125252 ON DISK PFWAT: BIS #BIT8,@DCS ;CLEAR DISK CLR DMA CLR TRACK MOV #PFWAT,HRDER ;SET UP FOR HARD ERROR MOV #DOWN,24 ;SET UP POWER FAIL VEC. MOV #340,26 MYBYWR: WRITE +100 BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR MYBYWR BR PFWAT 8: 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! LODF05: 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 LS906 .WORD PRIP07&100000!$PS007 .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... OV MR TEISEG RADHE AOKLO ;; ;R DBEL SR B ERFFBUA AT DTOINR SOV M ;BR@DR,@SV MO: BRLDSE ERSTGIRER FEUF BTADA ;; AELDSER B EG RXT EDRADK IS DTOINR SOV;ME DA,@SR @OV ME:DAEL SR TEISEG RORRR END AXT ESSREDD ASKDI ;; ARLDSER B EG RDRADK IS DTOINR SOV;MR DA,@SR @OV MR:DAEL SR TEISEG RSSREDD ASKDI ;; MALCSER B EG RDRADT ENRRCUO NT ISRV MO ;MA@CR,@SV MO: MALCSE ERSTGIRES ESDRADT ENRRCU ;; WCEL SBR G RET UNCOD OR WTOINR SOV;M WC,@SR @OV MC:LWSE ERSTGIRET UNCOD OR;W ;R TEISEG RCHITSWE ; ;ROUTINE TO CHECK DATA AFTER POWER FAIL ; UPCHK: BIS #BIT8,@DCS ;CLEAR THE DISK CLR DMA CLR TRACK MOV #UPCHK,HRDER ;SET UP FOR HARD ERROR CHKDAT: WRCHECK +100 BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR CHKDAT JMP PFWAT ;GO WAIT FOR ANOTHER ;POWER FAIL ; ;POWER DOWN ROUTINE ;ABORT DISK AND HALT ; ; DOWN: BIS #BIT8,@DCS ;ABORT DISK MOV #UP,24 ;SET POWER FAIL VECTOR HALT ; UP: MOV #DOWN,24 MOV #1000,%6 <D 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)+ JSR 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 =MOV R2,-(SP) MOV R1,-(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 ATHA VIS ERSTGIREO I/E THN ;I TSBIT SEO TORATEROPE THW LOALO TNETIOU;R C SSPA @MP J OK 1 +MT E ERFFBUW NEE ITWR ;W DNWRR B ERFFBUK IS DEW NUPT SE ;UFSBDI7, %SR J ITWA R CS,@TYRIIOPRV MO 2 +1 .BR T IO 6 .+E BN ; R @S9,IT#BT BI 0 10 +CKHERC W ITWA R CS,@TYRIIOPRV MO 2 +1 .BR T ES TNDOUGRCKBA ; OT I +6 .NE B ITWAO TOW HONK ECCH ;SR,@T9BI #IT B 00+1E ITWR: NWRD WR DEHRL,FAOW#PV MO S ESDRADT ENRRCUP UET;SF BUF,BUUT#OV MO R FEUF BTADAE ATEREN;GL SEPA5, %SR J CTRD,WCTRDSWV MO T UN? MOV #-300.,WORK ;SET UP TWENTY SECOND TIMER TIMCNT: RESET INC WORK ;+1 TIMER BNE TIMCNT ;TWO SECONDS NOT UP GO WAIT JMP UPCHK ;GO CHECK DISK ; ; ; ; ; ; ;POWER FAIL TEST #2 ;DISK ZERO ;WRITE COMPLETE DISK WITH 125252 PATTERN ;REPORT "OK" ;WRITE CHECK DISK AND WAIT FOR POWER FAIL ;WHEN POWER COMES BACK WRITE CHECK DISK AGAIN ;AND CHECK FOR ERRORS ;***NO ERRORS SHOULD OCCUR.*** ; ;DO NOT CREATE ANOTHER POWER FAIL UNTIL ;THE ADDRESS REGISTER HAS COMPLETELY CYCLED ;THROUGH. ; BR LODF03 ;MORE LODF09: CLR PRSIZE ;INIT PROGRAM LOAD SIZE MOVB #1,LODF10 ;INIT SWITCH TO MONITOR FIRST 32 WORDS ;******* MOV #LSDBGN,R0 ;INIT PTR TO LSD MOV R0,PTROBJ ;...AND TO CURRENT OBJ MODULE BR LODF20 LODF10: BR .+2 ;******* BR LODF12 ;CLOSED SWITCH SKIPS CHECK OF 1ST 32 WDS;******* CMP PRSIZE,#HEDSIZ S OFFSET FROM RELOCATABLE ZERO MOV DSPLCE,R4 ;ACCOUNT FOR "CURPC'S" DISPLACEMENT... ;******* NEG R4 ;...FROM LOAD MODULE ZERO ;******* CMPB (R4)+,(R4)+ ;...AND FOR THE PC INCREMENT AFTER FETCH;******* 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 OFFSCOD OR WUPET;ST DCWR,S0020 #OV M CKRA TLR C MA DLR C RNTEAT PUPT SE ;NUAT,P20 #OV M %60,00#1V MO C SSPA),(6V MO K IS DHE TARLE;CS DC,@T8BI #IS BL:FAOW PN IOETPLOM CAT" OK "RTPORE ;R CUOC ; EYTHF IRSROERT OREP RND ACKHE CTERI;W RNTEAT P525212H IT;W SKDIE ETPLOM CHE TTERI WTOE INUTRO ;; ;; ;; SKDIK ECCHO ;G FLWR PBR T AI WGOP UOT NDSONEC SWO;T NTMCTI XNE B R METI1 ;+ RKWOC IN T SERE: NTMCTI XR METID ONEC STYENTWP UET;SK OR,W0.30#-V MO 6 ,%0010 #OV M ORCTVEL AI FEROW PETES;R4 ,2DNPFT2: MOV #1000,%6 ;SET UP STACK JSR %7,POWFAL ;WRITE 125252 ON DISK PWRFL: CLR DMA CLR TRACK MOV #PWRFL,HRDER ;SET UP HARD ERROR MOV #PWRDN,24 ;SET UP POWER FAIL VEC. MOV #340,26 CHKDSK: WRCHECK +100 BIT #BIT9,@SR BNE .+6 IOT ;WAIT IN BACKGROUND BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;CHECK NEXT BUFFER BR CHKDSK BR PWRFL ; ;ROUTINE TO ABORT DISK DURING POWER FAIL ; PWRDN: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #PWRUP,24 ;SET UP RESTART HALT ; PWRUP: MOV #PWR