.TITLE MT ROLLOUT FILE READER DRIVER .MCALL ..V2..,.REGDEF ..V2.. .REGDEF .MCALL .PRINT,.TTYIN,.INTEN ; REGISTER DEFINITIONS MTS=172520 MTC=172522 MTBRC=172524 MTCMA=172526 MTVEC=224 BR7=340 BR5=5 ;OPERATION DEFINITIONS ;THE FOLLOWING VAR"TYPE" DEFINES THE TYPE OF UNIT ON THE SYSTEM ; AT PRESENT IT IS DEFINDE FOR 800BPI 9 TRACK TYPE=60000 ;FOR OTHER TYPES OF DRIVES CHANGE THIS TO ;40000 FOR 800BPI 7 TRACK ;20000 FOR 556BPT 7 TRACK ;0 FOR 200 BPI 7 TRACK ; ;DEFALT OPERATION IS ON MT0:-FOR USE ON OTHER TAPE DRIVE NO ; INSERT THAT NUMBER IN THE DEFINITION OF TYPE IN BITS 8,9,10 ; SEE THE PERIFERALS MANUAL FOR THE FORMAT OF THE COMMAND REGISTER RW=TYPE+17 ;REWIND SKF=TYPE+11 ;SKIP FORWARD SKB=TYPE+13 ;SKIP BACKWARD READI=TYPE+103 ;READ BLOCK INTERUPT ENABLED READ=TYPE+3 ;READ BLOCK NO INTERUPT PIC=1 ;POSITION INDEPENDENT CODE .CSECT .WORD MTVEC .WORD MTINT-. .WORD BR7 MTLQE: .WORD 0 MTCQE: .WORD 0 MT: BR FRSTIM ;THIS INSTRUCTION EXECUTED ONLY ONCE- IT ;IS CHANGED TO A NOP AFER INITIALISATION JMP OTRTIM ;SKIP INITALISATION RTN AFTER 1ST TIME ; INITIALISATION ROUTINE FRSTIM: MOV #RW,@#MTC ;REWIND TAPE IMESS=MESS-MTINT ;PRINT MESSAGE ASKING FOR ROLLOUT FILE MOV #IMESS,R0 ; NUMBER YOU WANT TO WORK ON ADD @#MTVEC,R0 ; THIS IS A DRIVER SO ALL CODE IS PIC .PRINT CLR R1 ;GET NO OF FILE-R1 CONTAINS CONVERTED NO. DINLB: .TTYIN ;GET CHR BIC #177700,R0 CMPB #12,R0 ;? BEQ DIGDNE ;DONE IF YES CMPB #15,R0 ;? BEQ DINLB ;IGNORE IF YES ASL R1 ;MULT CONTENTS OF R1 BY 10(8) ASL R1 ASL R1 SUB #60,R0 ; CONVERT FROM ASCII TO OCTAL ADD R0,R1 ;ADD NEWEST LOEW ORDER DIGIT TO R1 BR DINLB ;GO BACK FOR ANOTHER DIGIT DIGDNE: BIT #2,@#MTS BNE DIGDNE ;IF NOT WAIT UNTIL YES MOV #-2,@#MTBRC ;THE FIRST FILE CONTAIN 2 EXTRA ; RECORDS WRITTEN BY ; ROLLIN-THE ROLLIN BOOTSTRAP AND ROLLIN ;IMAGE-SKIP TWO ; SO AT END OF SKIP TO FILE WANTED ; WE WILL BE IN SAME POSITION EVEN IF ; FIRST FILE MOV #SKF,@#MTC ;SKIP BIT #200,@#MTC ;WAIT UNTILL DONE BEQ .-6 NXTFIL: DEC R1 ;SKIP FILES IF NEEDED R1 IS 1 GREATER THAN ; NUMER OF FILES TO BE SKIPED BLE ATFIL ;WHEN R1=0 WE ARE AT PROPER ROLLIN FILE NTEND: MOV #100000,@#MTBRC MOV #SKF,@#MTC ;SKIP FILE BIT #200,@#MTC BEQ .-6 TST @#MTC ;EOF FOUND OR SKIP COUNT USED UP BGE NTEND ;IF EOF NOT FOUND SKIP MORE BR NXTFIL ;EOF FOUND SEE IF NEXT FILE TO BE SKIPED ATFIL: MOV #-2,@#MTBRC ;EXCEPT FOR FIRST ROLLOUT FILE ;WHICH HAS 4 XTRA BLOCKS AHEAD OF ; THE ACTUAL ROLLOUT-ALL OTHER ROLLOUT ; FILES HAVE TWO XTRA-SKIP THEM MOV #SKF,@#MTC BIT #200,@#MTC BEQ .-6 IBUFF=BUFFER-MTINT MOV #IBUFF,R1 ADD @#MTVEC,R1 ;INITIALIZE BY READING IN 1ST BLOCK ; ON MAG TAPE (MT BLOCK 0) MOV R1,@#MTCMA MOV #-8192.,@#MTBRC MOV #READ,@#MTC BIT #200,@#MTC BEQ .-6 CLR PTR ;PTR CONTAINS MAGTAPE BLOCK NO PRESENTLY ; STORED IN THE BUFFER MOV #240,MT ;RESET BRANCE SO THIS INITIALISATION IS ONLY ; EXECUTED ONCE ; END INITIALISATION ROUTINE ; ENTER REGULAR SERVICE ROUTINE OTRTIM: MOV MTCQE,R3 TST 6(R3) ; WHAT TYE OPERATION BLT MTERR ;WRITE IS VERBOTEN BEQ SEEK ;SEEK REQUEST FAKE IT MOV (R3),R2 ;GET BLOCK NO OF DEVICE THAT WAS ROLLED OUT CCC ;CONVERT IT TO MT BLOCK NO ROR R2 ASR R2 ASR R2 ASR R2 MOV R2,R1 SUB PTR,R1 ;WHERE ARE WE NO WRT MT BLOCK WANTED BEQ SIMINT ;ALREADY THERE-FAKE INTERUPT BLT BACKUP ;WE GOTA GO BACK DEC R1 ;SKIP FWD-R1 CONTAINS ONE MORE RECORD TO BE ;SKIPED THAN WE ACTUALLY NEED TO BEQ RDBLK ;NEXT RECORD IS ONE TO BE READ-DONT SKIP NEG R1 MOV R1,@#MTBRC MOV #SKF,@#MTC ;SKIP TO RECORD(MT BLOCK) TO BE READ BIT #200,@#MTC BEQ .-6 BR RDBLK ;READ BLOCK BACKUP: DEC R1 ;R1 CONTAINS THE NEGATIVE OF 1 LESS THAN ; THE NUMBER OF RECORDS TO ; BE SKIPED MOV R1,@#MTBRC MOV #SKB,@#MTC ;SKIP BACK BIT #200,@#MTC BEQ .-6 RDBLK: MOV R2,PTR ;UPDATE POINTER MOV #-8192.,@#MTBRC ;READ THE 4K RECORD(MT BLOCK) MOV #IBUFF,R1 ADD @#MTVEC,R1 MOV R1,@#MTCMA MOV #READI,@#MTC ;READ WITH INTERUPT ENABLED RTS PC MTERR: BIS #1,@-(R3) ;SET HRD ERROR BIT SEEK: MOV R4,-(SP) ;FOR SEEK WE FAKE IT AND JUMP TO THE COMPLTN RTN MOV R5,-(SP) JSR PC,MTDONE MOV (SP)+,R5 MOV (SP)+,R4 RTS PC SIMINT: MOV #100,@#MTC ;SETTING I.E. W/O GO BIT RTS PC ;CAUSES AN INTERUPT ; ; INTERUPT SERVICE ROUTINE BR ABORT ;ABORT ENTRY POINT MTINT: .INTEN BR5,PIC ;OK MON INTERUPT HAS OCCOURED- RESET ; RRIORITY TO 5 BIC #100,@#MTC ;CLEAR INTERUPT MOV MTCQE,R4 MOV (R4),R5 ; GET BLOCK NO BIC #177760,R5 ;CALC LOCATION IN BUFFER SWAB R5 ASL R5 ADD #IBUFF,R5 ADD @#MTVEC,R5 ;R5=STARTING ADDR OF BLOCK IN BUFFER ; THIS ROUTINE ASSUMES THAT ALL BLOCK XFERS ARE MULTAPLES OF ; 256. WORDS XFRRTN: MOV #256.,-(SP) ;SET UP COUNTER XFRBLK: MOV (R5)+,@4(R4) ;XFER WORD ADD #2,4(R4) ;UPDATE BUFFER PTR DEC 6(R4) BLE DNEXFR ;DEC USER W.C., IF=0 DNE DEC (SP) BGT XFRBLK ;IF NOT DONE GO BACK FOR ANOTHER WORD CLR (SP)+ ;DISCARD CTR IBUFED=BUFEND-MTINT MOV #IBUFED,-(SP) ;CHECK TO SEE IF GOING PAST END OF BUFFER ADD @#MTVEC,(SP) CMP (SP)+,R5 ;HAVE WE USED UP 4K BUFFER BHI BUFROK ;NO STLL AT LEAST 1 MORE 256. WRD BLOCK IN IT MOV #IBUFF,R5 ADD @#MTVEC,R5 MOV R5,@#MTCMA ;NEED NEW BUFFER FULL MOV #-8192.,@#MTBRC ;FILL IT MOV #READ,@#MTC INC PTR ;INC PTR TO NEXT MT BLOCK NO IN BUFFER BIT #200,@#MTC BEQ .-6 BUFROK: BR XFRRTN ;GO BACK FOR MORE DNEXFR: CLR (SP)+ ;DISCARD CTR ABORT: MTDONE: MOV PC,R4 ADD #MTCQE-.,R4 MOV @#54,R5 JMP @270(R5) ;DONE- GO TO COMPLETION ROUTINE ; IMPURE AREA MESS: .BYTE 15,12 .ASCII /ROLLIN FILE NO. ? / .BYTE 200 .EVEN PTR: .WORD 0 ; CONTAINS MT BLOCK NO CURRENTLY IN BUFFER BUFFER: .BLKW 4096. ;1 ROLLIN BLOCK OF 4096. WORDS STORED ; HERE BUFEND: .WORD 0 .END