@ȋ ȋ _V`ȋ _ `ȋ    '@@8 w Hw U!w  w  w  b`5@5%E`$* N7 J z5@w * w pd  w TF   %mp    .TITLE MTLOAD - BOOT A MAGTAPE ; .MCALL .PARAMS .PARAMS ; START: CLR R0 MOV #10,R1 ;WE MUST WAIT 1$: INC R0 ;FOR DOS TO BNE 1$ ;SETTLE DEC R1 ;DOWN AFTER BNE 1$ ;HAVEING DONE A LOAD ; RESET ; MOV #MSG,R0 ;ASK FOR SOMETHING 2$: MOVB (R0)+,R1 BEQ 5$ MOV R1,@#177566 ;PRINT A CHAR 3$: JSR PC,4$ ;SEE IF HE ANSWERED TSTB @#177564 ;HE DIDN'T, IS CHAR DONE? BPL 3$ ;NO - LOOK AGAIN BR 2$ ; 5$: JSR PC,4$ ;KEEP ON LOOKING FOR BR 5$ ;AN ANSWER ; 4$: TSTB @#177560 ;ANYTHING .TITLE ROLLIN .LIST TOC,MEB .NLIST TTM .SBTTL ROLLIN - STAND-ALONE DISK/DECTAPE/MAGTAPE ROLLER .SBTTL .SBTTL COPYRIGHT 1973,1974 BY DIGITAL EQUIPMENT CORP., MAYNARD, MASS. .SBTTL EDIT: DATE: BY: .SBTTL 03 15-JAN-73 NAT/MHB/GWB/JDM .SBTTL .SBTTL LINKING INSTRUCTIONS: .SBTTL #ROLLIN 41, REMAINING ; BYTES WILL BE CLEARED. ; ALL ERRORS (INCLUDING 'HOPPER EMPTY' UPON ; AN 'OPEN' CALL) WILL BE TREATED AS 'DEVICE ; NOT READY'. USER CAN RESUME OPERATION BY ENSITY FUNCTION MTPWRC =10000 ;POWER CLEAR FUNCTION MTTUR =1 ;TAPE UNIT READY FLAG MTWRL =4 ;WRITE PROTECT BIT MTBOT =40 ;BEGINNING OF TAPE FLAG MTBTE =400 ;BAD TAPE ERROR MTRLE =1000 ;MAGTAPE RECORD LENGTH ERROR MTEOT =2000 ;END OF TAPE ERROR MTPAE =10000 ;MAGTAPE PARITY ERROR MTCRE =20000 ;CYCLIC REDUNDANCY ERROR MTEOF =40000 ;MAGTAPE EOF ERROR .CSECT ROLLIN .CSECT ODT .CSECT ROLLIN ;THIS SMALL ROUTINE READS IN THE REST OF THE ROLLER AFTER IT ;HAS BEEN LOADED VIA MOV #DF.ENO,-(SP) ;SET UP ERROR NO. BIT #SDRVR,DFFLGS ;SYSTEM DRIVER? BEQ DF.SND ;NO - BRANCH CLR @SP ;CODE TO FORCE A HALT DF.SND: IOT ;GO TO DIAG. PRT. ; SAVEAD: 0 ;SAVE LOCATIONS IN CASE OF NOT TRANSFERRING A MULTIPLE SAVE1: 0 ;OF FOUR WORDS (UNUSED OTHERWISE) SAVE2: 0 SAVE3: 0 NOT4: 0 ;FLAG INDICATION A NOT MULT OF 4 XFER (IF NON-ZERO) ; ;DEFINITIONS: DF.DCS=165300 DF.DIR=1 DF.ENO=1426 V.XIT=42 V.RSAV=44 SDRVR=10000 .END DR OFF STACK MOV LP,R0 JMP @14(R0) ;TAKE COMPLETION RETURN ;********************************************************************* ;********************************************************************* LP.TFR: ;TRANSFER ROUTINE MOV (SP)+,SAVRTN ;POP STACK NOW IN CASE OF NO RETURN... ;FROM THE PRINT SUBROUTINE ; DO BUFFER CALCULATION HERE IN CASE OF NO OPEN CLRB FORMFD ;FLAG TO EJECT AFT!; RECTIFICATION OF ERROR OR REFILL OF HOPPER ; AND ENTRY OF 'CO' COMMAND AT KEYBOARD. ; THE END OF A FILE WILL BE DETERMINED BY ; RECOGNITION OF A TERMINAL CONTROL CARD:- ; 12-11-8-9 PUNCHED IN C.C.1 ; ; XXXXXXXXXXXXXXXXXXXXXXXXX ; X X ; X NOTES X ; X X ; XXXXXXXXXXXXXXXXXXXXXXXXX ; .PAGE ;************************************************************************ ; 0) IN THE FOLLOWING, ALL REFERENCES TO '026' CODE NOW SHOULD ; BE INTERPRETED AS UN"THE HARDWARE BOOT. IT THEN DISPATCHES TO COMCON BOOT: MOV #40000,SP ;START STACK UP AT 8K RESET ;MAKE EVERYTHING GO AWAY MOV #DT.CA,R0 ;POINT TO CORE ADDRESS MOV #BOOT,(R0) ;LOAD IT WHERE WE ASSEMBLED IT MOV #0-SIZWRD,-(R0) ;LOAD ALL OF ROLLIN MOV #4003,-(R0) ;BACK IT UP TO ENDZONE TSTB (R0) ;WAIT BPL .-2 ;KEEP WAITING TST -(R0) ;WAITED LONG ENOUGH---AT ENDZONE? BPL BOOT ;NOPE--DO IT AGAIN TST (R0)+ ;POINT TO CSR AGAIN MOV #5,(R0) ;DO THE READ TSTB (R0) ;WAIT SOM# .TITLE RCBOOT ; ; DDC DISK BOOTSTRAP ; ; THIS IS A MODIFIED VERSION OF RFBOOT, SET UP FOR THE ; GULF DDC DISK ; ; CREATED ON MAY 14, 1973 BY DAVE MCMILLEN ; R0=%0 R1=%1 R2=%2 R3=%3 ;HARDWARE REGISTERS R4=%4 ;R5 ;SP PC=%7 ; CLEAR=400 ;DISK CONTROL CLEAR COMMAND READ=5 ;READ COMMAND ; .GLOBL RCSTRT ; RCSTRT: START: MOV #INIT-START,R0 ;GET START OF CODE TO MOVE MOV BEGIN,R1 ;GET START OF DESTINATION MOV R1,R4 ;SAVE FOR TRANSFER MOVE: MOV (R0)+,(R1)+ ;MOVE CODE TO HIGH CORE $ER A LINE TST BUFBGN ;SEE IF BUFFER CALC'N NEEDED BNE LP.TF1 ;NOT NEEDED MOV PC,R1 ADD #LP.BUF-.,R1 ;CALC LOCAL BUFFER BEGIN MOV R1,BUFBGN ;SAVE FOR REF BELOW ADD #133.,R1 MOV R1,BUFEND ;SAME FOR END OF BUFFER LP.TF1: MOV LP,R0 ;DDB MOV 10(R0),R1 ;(NEG) WORD COUNT ASL R1 ;(NEG) CHAR COUNT DEC R1 ;DUE TO FIRST "INC R1" @LPXF02 MOV 6(R0),R2 ;MONITOR BUFFER START JSR PC,LPTR00 ;GO XFR MON B%IVAC 'FIELDATA' CODE. ;************************************************************************ ; 1) THIS DRIVER CAN BE ASSEMBLED FOR USE ; IN CONNECTION WITH EITHER '026' OR '029' ; PUNCHES OR BOTH AS INDICATED BY PARAMETER ; SPECIFICATION AT START OF SOURCE INPUT ; AS FOLLOWS:- ; ; A) "ONLY26=0" - READ ONLY '026' CODES. ; B) "ONLY29=0" - READ ONLY '029' CODES ; C) "DEFALT=0" - READ BOTH TYPES OF CODE ; WITH '026' AS DEFAULT ; D) NIL - READ BOTH TYPES OF CODE ; WITH '&E MORE BPL .-2 ;AND SOME MORE TST (R0) ;ERROR? BMI BOOT ;YES--TRY AGAIN JMP @#START ;AND GO GET KEYBOARD INPUT ;THIS BOOTSTRAP IS USED TO LOAD ROLLIN AFTER IT HAS BEEN BOOTED ;FROM MAGTAPE.... MTBOOT: RESET ;CLEAR EVERYTHING MOV #7*40,@#PS ;IOF MOV #MTACMA,R0 MOV #BOOT,(R0) ;LOAD EVERYTHING MOV #0-SIZBYT,-(R0) ;THATS ABOUT ALL OF ROLLIN MOV #BPI+MTRD,-(R0) ;READ FROM UNIT 0 TSTB (R0) ;AND WAIT FOR DONE.. BPL .-2 TST (R0)+ ;CHECK FOR ERROR.. BMI MTB1 ;OUCH...ERROR J' CMP R0,#END-START ;CHECK FOR END OF MOVE BNE MOVE ;LOOP UNTIL END OF CODE MOV R4,PC ;THEN TRANSFER TO BOOT INIT: SUB #20,R1 ;POINTER TO PARAMETERS MOV #READ,R2 ;DO A 'READ' INIT00: RESET ;CLEAR THE BUS MOV PC,R4 ;SAVE START ADDRESS BOOT: MOV EXTRPG,R0 ;GET EXTERNAL PAGE ADDRESS MOV #CLEAR,(R0) ;CLEAR OUT RF CONTROL ADD #10,R0 ;ADD DEFLECTION CLR (R0) ;CLEAR EXT. ADDRESS MOV (R1)+,-(R0) ;SET START BLOCK BOOT1: MOV (R1)+,-(R0) ;SET MEMORY ADDRESS MOV (R1)+,-(R0) ;GET BYTE (UF TO LOCAL & PRINT MOV SAVRTN,PC ;RETURN TO MONITOR CALLER ;********************************************************************* ;********************************************************************* LPER02: JSR PC,ERMES ;ERROR MOV #100,@#R.CM ;ISSUE RESET BEFORE RE-TEST LP.INT: ;INTERRUPT ENTRY POINT CLR @#R.CM ;DISABLE INTERRUPTS BIT #40001,@#R.ST ;BUSY OR PAPER LO? BNE LPER02 ;YES MOV )029' AS DEFAULT ; ; IN CASES (C) & (D), DRIVER WILL USE DEFAULT ; UNLESS DIRECTED OTHERWISE BY ENTRY OF A ; CONTROL CARD PUNCHED IN C.C. 1:- ; ; 12-11-8 = '029' CODES FOLLOW ; 12-11-9 = '026' CODES FOLLOW ; ; 2) IF PARAMETER "BLANKS" IS DEFINED, ; ALL TRAILING SPACES WILL BE SUPPRESSED, ; WITH 'CR-LF' FOLLOWING LAST VALID DATA. ; IF THE CARD FILE IS PRECEDED BY CTL CARD WITH ; 12-11-0 ; PUNCHED IN C.C.1, THE TRAILING SPACES WILL*MP @#START ;START THE WORLD MTB1: MOV #-1,(R0) ;BACKSPACE RECORD AND TRY AGAIN... MOV #BPI+MTSR+1,-(R0) TSTB (R0) ;WAIT.... BPL .-2 BR MTBOOT ;DATA FOR CONTROLLING ROLLOUT/ROLLIN DTPAR: .BYTE 0 ;FUNCTION (+0) .BYTE 0 ;UNIT,DIRECTION (+1) .WORD 0 ;BLOCK # (+2) .WORD 0 ;CORE ADDRESS (+4) .WORD 0 ;BLOCK COUTN (+6) .WORD 0 ;ERROR COUNT (+10) .WORD -1 ;INSURE THAT FIRST DTABL ENTRY <> THIS DTABL: .BYTE 0 ;PHYSICAL DRIVE FOR FIRST UNIT .BYTE 0 ;SECOND UNIT, ETC. .BYTE 0+COUNT CLC ;INSURE CARRY=0 ROR (R0) ;MAKE INTO WORD COUNT ADC (R0) ;ROUND UP IF NECESSARY NEG (R0) ;NOW IT IS -WORD COUNT MOV R2,-(R0) ;SET FUNCTION AND GO WAIT: TSTB (R0) ;WAIT FOR READY BPL WAIT ;KEEP WAITING TST (R0) ;CHECK FOR AN ERROR BMI ERROR ;ERROR FOUND JMP @(R1)+ ;ELSE DISPATCH .=START+200-30 ERROR: HALT ;HALT ON ERROR CMP -(R1),-(R1) ;BACK UP THE R1 TST -(R1) ;PARAMETER POINTER BR INIT00 ;AND RETRY BLOCK: .WORD 0 ;START BLOCK LOAD: .WORD 0 ;LOAD,@#$RSAVE,-(SP) JSR R5,@(SP)+ ;SAVE REGISTERS ON STACK BIT #30,@#R.ST ;ANY PARITY ERRORS? BNE LPIN06 LPIN05: BIT #2,@#R.ST ;HOW ABOUT "ON-LINE"? BNE LPIN04 ;IT'S SET, SO O.K. TO PREPARE NEXT LINE LPIN06: CLR @#PS ;DROP CPU LEVEL TO ALLOW OTHER INTS CLR @#R.AD ;CLEAR ADDR REG IN PREP FOR RE-TRY LPIN03: MOV #100,@#R.CM ;ISSUE RESET TO CLEAR CONDITION MOV @#R.ST,R0 ;GET STATUS COM R0 ;INVERT FOR TEST BIT #6,R0 ;OF [READY] AND [ON-LINE] BNE LPIN03 ;ONE OF THEM IS STI- NOT BE SUPPRESSED. ; IF A CONTROL CARD IS READ WITH C.C.1 CONTAINING: ; 12-11-0-8 ; AND SPACE COMPRESSION HAS NOT BEEN ; SUSPENDED (ABOVE), CC. 73-80 WILL BE IGNORED AND ; SPACE COMPRESSION WILL BEGIN AT CC. 72 AND MOVE DOWNWARD. ; 3) IF THE NUMBER OF COLUMNS READ AT CARD DONE IS ODD, ;12-17-72 ; THE CARD IS NOT PROCESSED AND THE "NOT READY" MSG IS OUTPUT. ;12-17-72 ; THIS FORMS A TRAP FOR THE OCCASIONAL EXTRA INTERRUPT. . .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 FLAGS: .WORD 0 ;FLAGS FROM SCAN ILB: + 0,0 ;INPUT LOGICAL BLOCK # ILB0: + 0,0 ;FIRST LOGICAL BLOCK IN SET ILBEND: + 0,0 ;LAST LOGICAL BLOCK IN SET OLB: + 0,0 ;OUTPUT LOGICAL BLOCK # OLB0: + 0,0 ;FIRST LOGICAL BLOCK ON OUTPUT OLBEND: + 0,0 ;LAST LOGICAL BLOCK IN: + 0 ;ADDRESS OF INPUT ROUTINE OUT: + 0 ;ADDRESS OF OUTPUT ROUTINE DTIBC: + 0 ;# OF BLO/ ADDRESS COUNT: .WORD 0 ;BYTE COUNT XFER: .WORD 0 ;TRANSFER ADDRESS BSIZE: .WORD 64. ;BLOCK SIZE BEGIN: .WORD 37250 ;BOOTSTRAP START EXTRPG: .WORD 165300 ;EXTERNAL PAGE ADDRESS ;OF PROCESSOR STATUS REGISTER INDEX: .WORD 4 ;MONLIB.SYS START END: .END ;HALT ON ERROR CMP -(R1),-(R1) ;BACK UP THE R1 TST -(R1) ;PARAMETER POINTER BR INIT00 ;AND RETRY BLOCK: .WORD 0 ;START BLOCK LOAD: .WORD 0 ;LOAD ADDRESS COUNT: .WORD 0 ;BYTE COUNT XFER: .WORD 0 ;TRANSFER ADDRESS B0LL OUT MOV WCSAVE,R4 ;GET PREVIOUS WORD COUNT... BEQ LPIN02 ;DON'T PRINT IF BLANK LINE JSR PC,LPPR01 ;...AND GO PRINT LINE AGAIN BR LPIN02 ;...AND EXIT LPIN04: TSTB FORMFD ;DID A FORM FEED END LAST LINE? BEQ LPIN01 ;NO JSR PC,NEWPGE ;YES; EJECT NOW LPIN01: MOV MONCNT,R1 ;RESTORE CHAR COUNTER MOV MONBUF,R2 ;CURRENT MONITOR BUFFER POINTER JSR PC,LPTR00 ;GO GET ANOTHER LINE AND PRINT IT LPIN02:1 ;12-17-72 ; B) IF THE PARAMETER "BINARY" IS DEFINED AT ASSEMBLY, ; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ; ; THIS VERSION WILL ALSO ALLOW READING OF CARDS ; IN BINARY FORMAT. AS EACH CARD IS READ, 12 BITS FROM ; ALL 80 COLS WILL BE ACCESSED & STORED IN AN INTERNAL ; BUFFER IN A PACKED FORM, I.E. 4 COLS = 3 WORDS AS ; FOLLOWS:- ; C.C.1 > WORD 1, BITS 15-4 ; C.C.2 > WORD 1, BITS 3-0; WORD 2, BITS 15-8 ; C.C.3 > WORD 2, BITS 7-0; WORD 3, BITS 15-12 ; C.C.4 > WORD 3, BITS 112CKS WRITTEN ON INOUT TAPE DFPAR: .WORD 0,0 ;SECTOR ADDRESS (+0,+2) .WORD 0 ;CORE ADDRESS (+4) .WORD 0 ;SECTROR COUNT (+6) .WORD 0 ;FUNCTION (+10) .WORD 0 ;ERROR COUNT (+12) ;SWITCH PARAMETERS--- DISKS: + 0 ;# DISKS TO DO NUM: + 0,0 ;# TRACKS TO DO TRACK: + 0,0 ;FIRST 1K TRACK TO DO LABEL: + 0 ;0 FOR NORMAL PROCESSING, -1 TO SKIP LABEL RBFLAG: + 0 ;RUBOUT FLAG FOR GETIN LPYFLG: + 0 ;LEAP YEAR FLAG (/DATE) TRACKS: + 0 ;NUMBER OF TRACKS ON ONE PLATTER BUFSIZ: + 0 ;NUMBSIZE: .WORD 64. ;BLOCK SIZE BEGIN: .WORD 37250 ;BOOTSTRAP START EXTRPG: .WORD 177460 ;EXTERNAL PAGE ADDRESS 4 MOV @#$RSTOR,-(SP) JSR R5,@(SP)+ ;GO RESTORE REGISTERS SAVED ABOVE RTI ;RETURN TO INTERRUPTED PROGRAM LPTR00 = . ;SUBROUTINE TO PRINT ONE LINE FROM MON BUFFER MOV CURBUF,R3 ;LOCAL POINTER FROMLAST TIME BNE LPXF02 ;STILL IN MIDDLE OF LINE LPTR01: MOV BUFBGN,R3 ;LINE WAS PRINTED: BEGIN NEW ONE LPXF01: MOVB #8.,TABPTR ;TAB POSITION COUNTER LPXF02: INC R1 ;COUNT DO5-0 ; ; THE PACKED FORM WILL BE TRANSFERRED TO THE USER ; BUFFER UNTIL THIS IS FILLED, ANY DATA THEN REMAINING ; IN THE INTERNAL BUFFER BEING RETAINED UNTIL THE ; NEXT READ REQUEST. ; ; TREATMENT OF ASCII READING WILL STILL FOLLOW PATTERN ; DESCRIBED IN THE PREVIOUS PARAGRAPH WITHOUT EXCEPTION. ; ; THE ONLY CONTROL CARD WHICH WILL HAVE ANY EFFECT ; IN BINARY READING WILL BE THAT INDICATING E.O.F. (IN ; THIS CASE 12-11-0-1 PUNCHING MUST APPEAR IN AT LEAST ; C.C. 1 THRU 8). ; ; N.B. WHEN ASSEM6ER OF BLOCKS IN BUFFER (SHOULD BE POWER OF 2) DSKDAE: + 0 ;0 IF RC11 -- RFDAE POINTER IF RF11 -- +1 IF RK11 ; + 2 IF RP11 RKIN: + 0 ;INPUT RK UNIT # IN BITS 15-13 RKOUT: + 0 ;OUTPUT RK UNIT # IN BITS 15-13 MTRWD: + 0 ;MAGTAPE FLAG: ;+1 TO INDICATE REWIND IS TO BE PERFORMED ;0 TO INDICATE LABEL CHECKING (WRITING) ;-1 TO INDICATE NORMAL OPERATION MTSKIP: + 0 ;SET TO NUMBER OF FILES TO SKIP MTREEL: + 0 ;CURRENT REEL IN FILE (FOR LABELS) MTNAM0: + 0 ;FILE NAME FOR MAG7;DEFINE HERE THE MACROS WE NEED .MACRO ZERO1 LOC,TABLE SUBST >,0 .ENDM ZERO1 .MACRO SUBST LOC,VAL ZZZ=. .=LOC .WORD VAL .=ZZZ .ENDM SUBST .MACRO PSUBST LOC,VAL .GLOBL VAL SUBST >,VAL .ENDM PSUBST .MACRO EMSPEC S .MACRO SPECEMT .IRP P, SUBST >,1 .ENDM .ENDM SPECEMT .ENDM EMSPEC .MACRO GSLOT DEV,IVA .IF DF,FT'DEV .RAD50 /DEV/ ;DEVICE NAME RADIX 50 .WORD 0,IVA,0 ;CORE ADDR,INTERR. VECT ,DISK ADDR DVNUM=DVNFWN MON-BUF CHARACTERS BEQ LPEMTY ;EMPTY: LEAVE BUF AS IS & RTN TO MON MOVB (R2)+,R5 ;FETCH NEXT CHAR BIC #177600,R5 ;CLEAR POSSIBLE PARITY BIT CMP R5,#40 ;<40? BGE LPXF03 ;NO CMP R5,#11 ;HORIZ TAB? BEQ LP.TAB ;YES CMP R5,#12 ;LINE FEED? BEQ LPPRNT ;YES: END OF THIS LINE CMP R5,#14 ;FORM FEED? GBLED FOR USAGE IN BOTH MODES, AN 'OPEN' ; CALL WILL NOT CAUSE READING OF A CARD TO ALLOW THIS ; TO BE TRANSLATED AS REQUIRED BY THE READ MODE ; SPECIFIED BY THE USER. ; ; C) DRIVER CAN ALSO BE USED FOR 80-COLUMN MARK ; SENSE READER. FOR 40 -COLUMN READER, ECONOMIES ; IN BUFFER SIZE CAN BE OBTAINED BY DEFINITION ; AT ASSEMLBY OF PARAMETER "MARKS". THIS WILL ; ALSO PREVENT AUTOMATIC REMOVAL OF COLS 33-40 ; IN 'BLANKS-SUPPRESS' MODE OF USAGE. ; XXXXXXXXXXXXXXXXXXXXXXXXX ; X X ; X NOTE ETAPE MTNAM1: + 0 ;FILE NAME (2ND WORD) MTDATE: + 0 ;DATE WORD FOR MAGTAPE LABELS MTFIND: + 0 ;FIND FILE SWITCH... V4A: + 0 ;SPECIAL V4A SWITCH VERIFY: + 0 ;SPECIAL VERIFY PASS OPTION PFMT: + 0 ;SPECIAL PACK FORMATTING OPTION MCOPYX: - 1 ;MAGTAPE COPY FLAG ;FLAG BIT ASSIGNMENTS---USED TO REPORT RESULTS OF COMMAND SCAN RHS =100000 ;RIGHT HAND SIDE WAS PRESENT WL =40000 ;WRITE LOCK SWITCH SET DFL =20 ;DISK SEEN ON LEFT DFR =10 ;DISK SEEN ON RIGHT DTL =4 ;DECTAPE SEEN ON LEFT HUM+1 .ENDC .ENDM GSLOT .MACRO RAD50N X B123=X D3=B123- B120=B123-D3 B12=B120/10 D2=B12- D1=B12/10 RAD53 \D1,\D2,\D3 .ENDM RAD50N .MACRO RAD53 X1,X2,X3 .RAD50 /X1'X2'X3/ .ENDM RAD53 .MACRO DFU P2,P1 .MACRO DFUG .WORD P2*400+P1 .ENDM DFUG .ENDM DFU .MACRO NUMMAC MACRO,SEQU,ARGL MACRO'SEQU ARGL SEQ=SEQ+1 .ENDM NUMMAC .MACRO UDEVG W1,W2 .RAD50 /W1/ .WORD 2,W2,0 DVNUM=DVNUM+1 .IRP P,<\USEQ> .MACRO DEV'P .RAD50 /W1/ .ENDM DEV'P ""DDDDDDD """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""@DDDDD """"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDTeffADDB B B ClT]kQC rvLkQD )xkQMkQC nkQC *p,`kQC t/kQC 3Pz}kQC 5T&&kQC r dTXkQC pq:%yC |kQkQkQo rq,`kQ|yc\kQTSkQHkBx$kQ1XfwkQ&o kQ& cwkQH:kQy:kQ/$Dwwwwwwwwwgffvgffa ͋,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 DTR =2 ;DECTAPE SEEN ON RIGHT MTAPE =1 ;MAGTAPE SEEN...PROHIBIT DECTAPE ;USEFUL PARAMETERS LB0= 25 LABLK= 24 SIZWRD =12000 ;SIZE OF ROLLIN IN WORDS SIZBYT =24000 ;SIZE OF ROLLIN IN BYTES SIZBLK =24 ;SIZE OF ROLLIN IN 256. WORD BLOCKS ;ONE TIME ONLY CODE TO START UP ROLLIN START: RESET ;CAN'T HURT NAT SAYS MOV #7*40,@#PS ;DITTO MOV #BOOT,SP ;INIT STACK JSR PC,INI ;OFF TO COMMON INITIALIZER JSR R5,MES ;TYPE ROLLIN VERSION + VERMES BR COMCO1 ;FALL INTO COMMAND DECODER J BNE LPXF02 ;NO: ILLEGAL, SO IGNORE INCB FORMFD ;YES: FLAG FOR HOME AFTER PRINT BR LPPRNT ;GO PRINT LINE LPXF03: CMP R5,#140 ;CHAR > 137? BGE LPXF02 ;YES: IGNORE JSR PC,PARITY ;LEGAL: GO SET EVEN PARITY MOVB R5,(R3)+ ;PUT INTO LOCAL BUFFER DECB TABPTR ;...AND KEEP TRACK OF POSITION BNE .+10 MOVB #8.,TABPTR ;RESET POINKX ; X X ; XXXXXXXXXXXXXXXXXXXXXXXXX ; ; PARAMETER DEFINITIONS CAN BE MADE DURING PASS 1 ; OF THE ASSEMBLY ONLY IF REQD AS DESCRIBED IN ; PAL-11R MANUAL, SECTION 9-2, E.G. ; ; #CR,LP:,/PA:2 ; ; XXXXXXXXXXXXXXXXXXXXXXXX ; .TITLE DV.CR .GLOBL CR ; STANDARD PARAMETER DEFINITIONS: BLANKS = 0 ;ENABLE BLANK SUPPRESSION DEFALT = 0 ;READ "FIELDATL .ENDM USEQ=USEQ+1 .ENDM UDEVG STDEMT=100 ;77 OCTAL STANDARD EMT'S UDEMT=0 UDDEV=0 ;NUMBER OF NONSTANDARD DEVICES UDEMSW=0 ;THE NUMBER OF USER DEFINED SWAPPABLE MODULES UDEMRS=0 ;USER DEFINED RESIDENT EMT'S NTYPES=4 EMTIO=27 ;MAXIMUM I/O MODULE CLNUM=2 ;WE DELIVER 2 MODULES!! DVNUM=0 ;MACROS WILL GENERATE THE NUMBER .MACRO RSEM0 .IRP P,<<0,>,<1,>,<2,>,<4,>> PSUBST P SEQ1=SEQ1+1 .ENDM .ENDM RSEM0 .MACRO RSEM1 .IRP P,<<30,>,<40,>> M;NO-EXISTANT DEVICE ERROR (TRAP AT 4 OCCURED) NXD: JSR R5,MES ;TELL HIM + ERRNXD BR COMCON ;MAGTAPE FILE WAS SHORTER THAN REQUEST ON READ... MTXAB: JSR R5,MES ;LET HIM KNOW IT + ERRXAB BR COMCON ;COMMAND DECODER------------ ;USER TYPES COMMANDS OF THE FORM ; ; DEV: SUBST >,0 SEQ=SEQ+1 .ENDM .ENDM CFNOEM .MACRO SPECEM .IRP P,<33,60> SUBST >,1 .ENDM .ENDM SPECEM .MACRO RESEMP .IRP P,<0,1,2,4,30,40> ZERO1 P,EMPRIM .ENDM .ENDM RESEMP .MACRO IDENT TXT .MACRO USRTXT .ASCIZ /TXT/<15><12> .EVEN .ENDM USRTXT .ENDM IDENT .MACRO MONVRS TXT .MACRO MONVER .ASCIZ /TXT/ .ENDM MONVER Q ;ORDER 0,1,...,7 ;BAD COMMANDS ARE REJECTED, AND NEW INPUT IS REQUESTED COMERR: JSR R5,MES ;TELL HIM NO SOAP + SYNTAX ;TAX COLLECTOR TIME COMCON: MOV #BOOT,SP ;SET STACK JSR PC,INI ;INITIALIZE THINGS COMCO1: JSR R5,INPUT ;PUT OUT STAR & WAIT FOR COMMAND + STAR JSR PC,GTOK ;PARSE THE STRING MOV FLAGS,R0 ;FIND OUT WHAT OPTION DESIGNATED BIT #WL,R0 ;WAS IT /WL? BEQ 5$ ;BRANCH IF NOT BIT #RHS,R0 ;DISK INPUT? BNE 6$ ;YES...WRITE LOCK INPUT UNIT MOV RKOUT,RKDA ;HE BETTER R R3 ;PRINT BUFFER EMPTY: RESET POINTER CMP R5,#12 ;WAS LAST MON BUF CHAR LINE FEED? BNE LPPR02 ;NO MOVB #201,ONECHR ;YES - SET UP TO SINGLE-SPACE CMPB @#SWR,#2 ;IS DOUBLE-SPACE SELECTED? BNE LPPR04 ;NO INCB ONECHR ;SET UP TO DOUBLE-SPACE LPPR04: JSR PC,PRTONE ;GO UPSPACE ONE OR TWO BR LPTR01 ;...AND GO BACK FOR MORE LP.TAB: MOVB #240,(R3)+ ;ALWAYS TAB AT LEAST ONE SPACE CMP S CR.ONR: JSR PC,CR.NRY CR.OPN: ;12-19-72 CLR @#CR.CSR ;GET ACTUAL STATUS, MINUS TRANSITION BITS ;12-19-72 BIT #400,@#CR.CSR ;IS READER READY? ;12-19-72 BNE CR.ONR ;IF NOT TELL USER TO READY .IFNDF ONLY26&ONLY29 .IFNDF DEFALT ;FOR DUAL-PUNCH DRIVER ... CLR (PC)+ ;... SET CONV. TABLE OFFSET CR.TOS: .WORD 0 ;TABLE OFFSET IF NOT DEFALT .ENDC .ENDM MONVRS UHAVE AN RK OR THIS TRAPS BR 7$ 6$: MOV RKIN,RKDA ;DITTO 7$: CMP #1,DSKDAE ;INSURE ITS AN RK11 BNE 5$ ;IGNORE /WL IF NOT MOV #RKWL,RKCS ;PERFORM WRITE LOCK 8$: TSTB RKCS ;WAIT FOR READY BPL 8$ 5$: BIC #-36-1,R0 ;DISPATCH ON LEFT,RIGHT HAND SIDES ADD R0,PC ;AS APPROPRIATE BR COMC0 ;NULL COMMAND BR COMC1 ; ;I.E. IDENT ;IN THE NEXT LINES THE IDENTIFICATION PRINTED AFTER THE V ;IN THE MONITOR MESSAGE IS DEFINED. DO NOT CHANGE THIS. MONVRS <08-02> .PAGE ;IF NO USER DEFINED EMT'S OR NON ;STANDARD DEVICES ARE TO BE ADDED TO THE ;SYSiECTOR # ROL R1 ; ASL R0 ;TRACK *4 ROL R1 ; BIT #DTL,FLAGS ;IS DIRECTION DISK TO DECTAPE? BNE COMC7 ;YES--THEN TRACK IMPLIES INPUT BLOCK MOV R0,OLB0 ;NO--THEN TRACK AFFECTS OUTPUT BLOCK #S MOV R1,OLB0+2 ; COMC7: BIT #DTR,FLAGS BNE COMC8 MOV R0,ILB0 ;SET UP INPUT BLOCK REFLECTING 'TRACK' MOV R1,ILB0+2 ; COMC8: MOV NUM,R0 ;NUMBER OF TRACKS TO TRANSFER MOV NUM+2,R1 ; ASL R0 ;CONVERT TO # SECTORS ROL R1 ; ASL R0 ;# * 4 ROL R1 ; MOV ILB0,ILBEND ;LAST BLOCK = FIRST jP.NAM,-(SP) ;PRINT A002 MESSAGE MOV #402,-(SP) IOT RTS PC ;RETURN WHEN OPERATOR TYPES CO NEWPGE: MOVB #300,ONECHR ;CODE FOR VFU CHANNEL #1 JSR PC,PRTONE ;GO OUTPUT IT CLRB FORMFD ;RESET FLAG AFTER EJECT RTS PC .PAGE PRTONE = . ;SUBRTNE TO PUT OUT ONE CHARACTER BIT #4,@#R.ST ;TEST "PRINTER READY" BEQ .-6 ;WAIT TILL THRU SO WON'TkRD MOV R1,CR.IBP ;OTHERWISE SAVE INT PTR TST R2 ;COME HERE ON INTERRUPT? BNE CR.ODN ;IF SO MODE SW. SET MOV @SP,-(SP) ;ELSE MUST SIMULATE ... MOV -(R2),2(SP) ;... STORE PC & PS SUB #16,SP ;... & DUMMY SAVE REGS. CR.ODN: TST (SP)+ ;IGNORE RETURN PC BR CR.DXT ;... & TAKE COMPLETION EXIT .ENDC ;INTERRUPT SERVICE ROUTINES: ; A) CHECK FOR ERROR & COLLECT INPUT: CR.INT: MOV R0,-(SP) ;SAVE USER R0 MOV CR.UBP,R0 ;GET USER BUFF PTR ... MOV @#CR.CSR,-(SP) ;... & READER STATUS ASL (lTEM, THEN THE EDITING OF THIS FILE ;IS FINISHED. ;IN THE NEXT SECTION NON-STANDARD EMT'S ;ARE DEFINED. THESE HAVE TO FALL IN THE RANGE ;140-177. ALL OTHER VALUES ARE RESERVED ;FOR DEC. ; ; ;IN THE NEXT LINE THE SYMBOL UDEMT ;MUST BE EQUATED TO THE DIFFERENCE ;BETWEEN THE HIGHEST EMT VALUE DEFINED AND ;77 (ALL NUMBERS ARE OCTAL). ;A ZERO MEANS THERE ARE NO NON STANDARD ;EMT'S. ;E.G. IF THE HIGHEST EMT IS 166 THEN UDEMT=67. UDEMT=0 ; ;TWO DIFFERENT TYPES OF EMT'S CAN BE ;DEFINED! ; 1. SmBLOCK + # BLOCKS MOV ILB0+2,ILBEND+2 ; ADD R0,ILBEND ; ADC ILBEND+2 ; ADD R1,ILBEND+2 ; MOV OLB0,OLBEND ;SAME FOR OUTPUT MOV OLB0+2,OLBEND+2 ; ADD R0,OLBEND ; ADC OLBEND+2 ; ADD R1,OLBEND+2 ; COMC9: MOV ILB0,ILB ;INITIALIZE THE TRANSFER MOV ILB0+2,ILB+2 ; MOV OLB0,OLB ;FIRST BLOCK TO OUTPUT MOV OLB0+2,OLB+2 ; COMC10: JSR PC,@IN ;FILL THE BUFFER JSR PC,@OUT ;NOW EMPTY IT ADD BUFSIZ,ILB ;UPDATE INPUT BLOCK NUMBER ADC ILB+2 ; ADD BUFSIZ,OLB ;UPDATE OUTPUT BLOCK NUMBER n CLOBBER MODE CLR @#R.LF ;MODETO FIRST-CHAR MOV #-1,@#R.WC ;ONE WORD MOV PC,-(SP) ;BUILD ADDRESS... ADD #ONECHR-.,(SP) ;...FOR THE ONE/CHARACTER WORD MOV (SP)+,@#R.AD ;LOAD MEMORY ADDRESS REG MOV #4000,@#R.CM ; START : NO INTERRUPT TST @#R.ST ;WAIT FOR DONE BPL .-4 BIT #4,@#R.ST ;TEST "PRINTER READY" BEQ .-6 ;SAME AS ABoSP)+ ;CHECK FOR SPECIAL CASES BCS CR.ERR ;GO RETRY IF ERROR BMI CR.DUN ;CLEAN UP IF DONE MOV R1,-(SP) ;NOW SAVE USER R1 .IFDF BINARY ;IN BINARY VERSION ... CR.ISW: BR .+4 ;... USE APPROPRIATE CONVERSION BR CR.ASC ; B) BINARY CONVERT & STORE: MOV CR.IBP,R1 ;GET INT BUFF PTR MOV @#CR.DB1,-(SP) ;... & INPUT MOV @SP,-(SP) ;... 2 COPIES FOR LATER COMB 1(R0) ;ODD COLUMN? BPL CR.BST ASL @SP ;IF SO SHIFT INPUT TO HIGH ASL @SP ASL @SP ASL @SP CLRB (R1)+ ;MAKE NXT INSTR = MpWAPPABLE EMT'S ; 2. EMT'S LOADED RESIDENT DURING ; SYSTEM INITIALIZATION ;FIRST DEFINE THE TOTAL NUMBER OF SWAPPABLE EMT'S ;(IN OCTAL) IN THE NEXT LINE (UDEMSW=...). UDEMSW=0 ;REPLACE 0 BY NUMBER OF SWAPPABLE ;EMT'S ;NEXT DEFINE THE NUMBER OF EMT'S TO BE LOADED ;RESIDENT DURING SYSTEM INITIALIZATION. UDEMRS=0 ;REPLACE 0 BY NUMBER OF ;USER EMT'S TO BE LOADED ;RESIDENT. ;AFTER THE DEFINITION OF THE NUMBER OF USER EMT'S, ;THE VALUES OF THE EMT'S MUST BE SPECIFIED. ;THIS IS DqADC OLB+2 ; CMP ILB+2,ILBEND+2 ;DONE YET ? BLO COMC10 ;NOPE, KEEP ON TRUCKIN' BHI 10$ ;DEFINITELY WELL DONE CMP ILB,ILBEND ;REALLY DONE ? BLO COMC10 ;NO 10$: CMP IN,#MTIN ;MAGTAPE INPUT? BNE COM11 MOV #1,MTSKIP ;SKIP TO EOF ON FILE CLR R2 ;EXPECT IMMEDIATE EOF SO IGNORE IT JSR PC,MTRW2 ;TO POSITION TAPE PROPERLY COM11: CMP OUT,#MTOUT ;MAGTAPE OUTPUT? BNE 29$ JSR PC,WTEOF ;CLOSE OUTPUT FILE... 29$: TST VERIFY ;WAS /VE INDICATED? BPL COM12 ;EXIT IF NOT ;VERIFY PASS SET UPOVE,IN CASE BACK TO AUTO MODE RTS PC WCSAVE: .WORD 0 SAVRTN: .WORD 0 CURBUF: .WORD 0 BUFBGN: .WORD 0 BUFEND: .WORD 0 MONCNT: .WORD 0 MONBUF: .WORD 0 ONECHR: .BYTE 0 .BYTE 0 FORMFD: .BYTE 0 TABPTR: .BYTE 0 PRTYCT: .BYTE 0 SHFTCT: .BYTE 0 .EVEN LP.BUF = . ;LOCAL BUFFER .=.+160. ;RESERVE SPACE FOR BUFFER .END sOVB CR.BST: BISB 1(SP),-1(R1) ;SET HIGH BYTE AS REQD. MOVB (SP)+,(R1)+ ;THEN LOW BYTE MOV R1,CR.IBP ;SAVE PTR CMP (SP)+,#7400 ;NOW LOOK FOR EOF CARD BNE CR.BXT DECB @R0 ;... PUNCHED 12-11-0-1 BPL CR.BXT ;... IN CC 1 THRU 8 ASLB @R0 BPL CR.EOF ;IF FND IGNORE REST OF CARD BR CR.CXT ;OTHERWISE TRY NEXT TIME .ENDC ; C) ASCII CONVERT & STORE: CR.ASC: MOVB @#CR.DB2,R1 ;GET COMPACTED INPUT TSTB @R0 ;IF FIRST C.C. ... BNE CR.CVT CMPB R1,#330 ;... LOOK tONE IN THE MACROS GEMU0-GEMU5 ;DO THIS IN THE FOLLOWING WAY: ; 1 DO NOT DEFINE MORE THAN 13 (OCTAL) ; EMT'S IN A SINGLE MACRO. .PAGE ; 2 DO NOT DEFINE BOTH RESIDENT EMT'S ; AND SWAPPABLE EMT'S IN THE SAME MACRO ; 3 START BY DEFINING THE VALUES OF SWAPPABLE ; EMT'S IN MACRO GEMU0, IF THERE ARE ; MORE THAN 13 (OCTAL) VALUES CONTINUE ; THE DEFINITION IN MACRO GEMU1 ; 4 THE TITLE OF EMT MODULES MUST BE .TITLE EM.XXX, ; WHERE XXX IS THE OCTAL NUMBER OF THE EMT. ; E.G. EMT 166 HAS A u MOV #1,VERIFY ;FLAG IS ONE TIME ONLY ;N O T E -- WE ARE ABOUT TO DO AN RK VERIFY. I DON'T REALLY ; TRUST THE RK HARDWARE 100% SO TO BE SAFE WE WILL DO IT ; THE SLOW WAY, READING ONLY ONE TRACK AT A TIME! MOV #12.,BUFSIZ ;READ ONLY ONE TRACK AT A TIME JSR R5,MES ;TELL HIM THAT WE HAVE STARTED + VPASS ;VERIFY SO HE CAN GO TO LUNCH BIT #DTR+DTL,FLAGS ;DIRECTION MUST BE RK TO RK! BEQ COMC6 ;GO DO VERIFY JSR R5,MES ;TELL HIM NO SOAP + NOGO COM12: JMP COMCON ;YES ;SET UP MAGTAPE FORv .TITLE CF.TBL START: .WORD LPROTO ;LENGTH OF PROTOTYPE PART .WORD PRODDL-PROMRT ;OFFSET OF DDL PROTOTYPE ;NOW THE PROTOTYPE MRT WILL BE DEFINED ;THERE ARE 4 POSSIBLE ENTRIES ;1 A CORE ADDRESS SET BY THE LINKER ;2 A ZERO MEANING EMT DOES NOT EXIST ;3 A 3 WHICH MEANS LOAD THIS EMT RESIDENT ;4 A ONE MEANING SWAP THIS GUY PHASE=0 NONLEM=STDEMT+UDEMSW+UDEMRS PROMRT: .REPT STDEMT .WORD 1 ;ALL CANDIDATES FOR SWAPPING .ENDM .REPT UDEMT .WORD 0 ;ALL NOT EXISTING .ENDM SEQ=0 CFwFOR E-O-F BEQ CR.EOF .IFDF BLANKS ;FOR BLANK SUPPRESS ... CMPB R1,#340 ;... LOOK FOR SUPPRESS OFF BEQ CR.ZON CMPB R1,#350 ;OPTION TO SUPPRESS CC. 73-80? BEQ CR.EON ;YES:GO SET SWITCH .ENDC .IFNDF ONLY26&ONLY29 ;FOR DUAL PUNCH DRIVER ... CMPB R1,#310 ;... CHECK IF 029 CONTROL BEQ CR.029 CMPB R1,#320 ;... OR 026 CONTROL BEQ CR.026 .ENDC CR.CVT: CMPB #140,R1 ;IS CHAR [!]? xTITLE STATEMENT: ; .TITLE EM.166 ; 5 THE LOAD MODULES SHOULD BE INSERTED IN THE CIL. ; THE EMT CODE SHOULD BE POSITION INDEPENDENT AND ; LINKED AT A BOTTOM OF 0. ;AFTER THE MACRO DEFINITION, VALUES OF USER DEFINED EMT'S ;CAN BE INSERTED BETWEEN THE ANGLE BRACKETS. ;NOTE SEE RULES: ;E.G. .IRP P,<140,146> ;DEFINES EMT'S 140 AND 146 .MACRO GEMU0 VAL .IRP P,<> .IIF EQ,PHASE SUBST>,VAL .IIF NE,PHASE R50>,P .ENDM .ENDM GEMU0 ;AFTER THE MACRO DEFINITION, VALUEy INPUT OR OUTPUT... MTEST: BIT #MTAPE,FLAGS ;WAS MAGTAPE SPECIFIED? BNE MTEST1 ;BRANCH IF SO.. CMP (R5)+,(R5)+ ;NO...PROCEED MTEST2: RTS R5 MTEST1: MOV #16.,BUFSIZ ;NORMAL MAGTAPE BUFFER SIZE MOV (R5)+,@(R5)+ ;LOAD INPUT OR OUTPUT CALL TSTB DTABL+1 ;INSURE THAT ONLY ONE UNIT IS GIVEN BPL MERROR ;OTHERWISE IT'S AN ERROR MOVB DTABL,R1 ;GET UNIT NUMBER MSET: MOV #MTAC,R0 ;NOW INIT MAGATAPE MOV #MTPWRC,(R0) ;EXECUTE A POWER CLEAR OF TM11 SWAB R1 ;PUT IN HIGH BYTE BIS #BPI,R1 ;LOADzNOEM PROMRT ;ZERO NON EXISTING ONES NONLEM=NONLEM-SEQ SEQ=0 SEQ1=0 .REPT RESEMT+3/4 NUMMAC RSEM,\SEQ .ENDM NONLEM=NONLEM-SEQ1 SEQ=0 .REPT UDEMSW+12/13 NUMMAC GEMU,\SEQ,1 .ENDM .REPT UDEMRS+12/13 NUMMAC GEMU,\SEQ,3 ;LOAD RESIDENT .ENDM ;NOW THE MRT PROTOTYPE IS THE THERE ;START HERE THE DDL PROTOTYPE PRODDL: GSLOT DC,130 GSLOT KB,60 GSLOT PR,70 GSLOT PP,74 GSLOT LP,200 GSLOT DT,214 GSLOT CR,230 GSLOT MT,224 .IF DF,FTMT .RAD50 /QT/ .WORD 0,224,0 DVNUM=D{ BNE CR.CV1 ;NO MOVB #41,-(SP) ;YES:LOAD ASCII CODE... BR CR.CV2 ;...FOR BUFFER BELOW CR.CV1: CMPB #240,R1 ;IS CHAR [?]? BNE CR.CV3 ;NO MOVB #77,-(SP) ;YES: LOAD AS ABOVE... CR.CV2: MOVB (SP)+,(R0)+ ;...AND POP FROM STACK TO KEEP IT HONEST BR CR.ST1 ;THEN SKIP TO END OF CONVERT LOOP CR.CV3: ;I COULDN'T THINK OF A BETTER WAY TST R1 BPL .+|S OF USER DEFINED EMT'S ;CAN BE INSERTED BETWEEN THE ANGLE BRACKETS. ;NOTE SEE RULES: ;E.G. .IRP P,<140,146> ;DEFINES EMT'S 140 AND 146 .MACRO GEMU1 VAL .IRP P,<> .IIF EQ,PHASE SUBST>,VAL .IIF NE,PHASE R50>,P .ENDM .ENDM GEMU1 ;AFTER THE MACRO DEFINITIONE VALUES OF USER DEFINED EMT'S ;CAN BE INSERTED BETWEEN THE ANGLE BRACKETS ;NOTE SEE RULES: ;E.G. .IRP P,<140,146> ;DEFINES EMT'S 140 AND 146 .MACRO GEMU2 VAL .IRP P,<> .IIF EQ,PHASE SUBST>,} DENSITY MOV R1,MT.HGH ;AND SAVE THIS FOR LATER USE MOV R1,(R0) ;LOAD COMMAND REGISTER MOV #100.,R2 ;BELIEVE IT OR NOT-- DEC R2 ;THERE IS A TIMING PROBLEM SO WE WAIT BNE .-2 ;A WHILE BEFORE TESTING SELECT...(UGH) BIT #MTTUR,-(R0) ;CHECK THAT UNIT SELECTED OK BNE MTEST2 ;BRANCH IF ALL OK SWAB R1 ;GET UNIT NO. FOR ERROR BIC #370,R1 ADD #60,R1 MOVB R1,MTOKU ;STORE IN UNIT NO. JSR R5,MES ;TELL HIM NO GO + ERRMTS ;SELECT ERROR BR COM12 ; ; ROUTINE TO MOVE A BYTE INTO THE L~VNUM+1 .ENDC GSLOT DK,220 .IF DF,FTDK DVNUM=DVNUM+1 ;COMPENSATE DKH AND DKL MODULE .ENDC .IIF NDF,DDCINT,GSLOT DF,204 .IIF DF,DDCINT,GSLOT DF,DDCINT GSLOT DP,254 ;PROTO TYPES OF USER DEFINED DDL SLOTS DIFFER THAT THE SECOND WORD IS ;NON ZERO THIS ALLOWS THE INITIALIZER TO DIFFERENTIATE BETWEEN ;NON STANDARD AND STANDARD DEVICES SEQ=0 SEQ1=0 ;# OF USER DEFINED MNEMONIC USEQ=0 .REPT UDDEV+2/3 NUMMAC GDVU,\SEQ .ENDM .WORD 0 ;TO TERMINATE PRODDL LPROTO=.-PROMRT ;HEA6 ;CONVERT CODES >200 ... ADD #340,R1 ;... TO RANGE >140 MOV R1,-(SP) ;STACK CODE FOR INDEXING CR.CV4: SUB #40,R1 ;FOR EACH 40 IN CODE ... BMI CR.STO ;... ADD 21 & STRIP 40 SUB #17,@SP ;... TO GET TABLE INDEX BR CR.CV4 ;...AND KEEP LOOKING CR.STO: .IFNDF ONLY26&ONLY29 ADD CR.TOS,@SP ;PICK APPROP. TABLE .ENDC ADD PC,@SP ;COMPUTE ADDR OF BYTE REQD ADD #CR.TBL-.,@SP MOVB @(SP)+,(R0)+ ;... & STORE IN BUFFER CR.ST1: CMP R0,CR.UBE ;BUFFER FULL? .PAGEVAL .IIF NE,PHASE R50>,P .ENDM .ENDM GEMU2 ;AFTER THE MACRO DEFINITION, VALUES OF USER DEFINED EMT'S ;CAN BE INSERTED BETWEEN THE ANGLE BRACKETS. ;NOTE SEE RULES: ;E.G. .IRP P,<140,146> ;DEFINES EMT'S 140 AND 146 .MACRO GEMU3 VAL .IRP P,<> .IIF EQ,PHASE SUBST>,VAL .IIF NE,PHASE R50>,P .ENDM .ENDM GEMU3 ;AFTER THE MACRO DEFINITION, VALUES OF USER DEFINED EMT'S ;CAN BE INSERTED BETWEEN THE ANGLE BRACKETS. ;NOTE SEE RULES: ;E.G. .IRP P,<140,14OW HALF OF THE MTC: ; MT.MVB: MOV (PC)+,-(SP) ;PICK UP UNIT/DENSITY PART OF THE WORD MT.HGH: 0 ;(SET FROM ABOVE, THANK GOD) BIS (R5)+,(SP) ;SET THE OTHER BITS IN MOV (SP)+,@#MTAC ;AND SET THE COMMAND IN RTS R5 ; ; MACRO TO CALL THE ABOVE: ; .MACRO MT.CMD ARG JSR R5,MT.MVB .WORD ARG .ENDM MERROR: JMP COMERR ;SYNTAX ERROR EXIT ;MAGTAPE COPY FUNCTION MCOPY: BIT #MTAPE,FLAGS ;IT MUST BE MAGTAPE BEQ MERROR TST MTNAM0 ;NO FILE NAMES PLEASE BNE MERROR MOV #DTABL,R0 ;CHECK UNDER SHOULD NOT MOVE PART2: ;HERE STARTS THE SECOND SECTION OF CF.TBL ;ITS CONTENT CONSISTS OF 2 PARTS: ;1 GENERAL INFO AND POINTERS TO ENTRIES IN THE SECOND PART ;2 A SET OF TABLES NEEDED TO PROCES THE THE REDUCED CILS ;THE GENERAL INFO SECTION HAS THE LAY-OUT: ;1 WORD 1 NUMBER OF TYPES HAVING TABLE INFO INSECOND PART OF THIS SECTION ;2 A TYPE HAS BEEN DEFINED IN RMON5 AS A NUMBER REPRESENTING ;3 AN ENTITY SUCH AS EMT,DRIVER .. THESE NUMBERS ARE MULTIPLES ; OF 4 STARTING WITH 4 AND BEQ CR.EXT CR.BXT: BISB @PC,@R0 ;IF NOT SET UNDERWAY FLAG CR.CXT: MOV R0,CR.UBP ;SAVE NEW POINTER MOV (SP)+,R1 ;RESTORE USER REGS. CR.IXT: MOV (SP)+,R0 RTI ;... & EXIT ; D) CARD COMPLETED: CR.DUN: CLRB @#CR.CSR ;STOP INTERRUPTS TSTB @R0 ;IF NO PROCESSING YET ... BEQ CR.RPT ;... CONTINUE BIT #1,R0 ;SEE IF ADDRESS IS EVEN (SHOULD BE FOR CC.81) BNE CR.ERR ;SOMETIMES MISSED INT ON FIRST CARD MOV (SP)+,R0 ;OTHERWISE RESTORE USER R0 MOV @#CR.RSV,-(SP) ;... & NOW SAVE ALL JSR6> ;DEFINES EMT'S 140 AND 146 .MACRO GEMU4 VAL .IRP P,<> .IIF EQ,PHASE SUBST>,VAL .IIF NE,PHASE R50>,P .ENDM .ENDM GEMU4 .PAGE ;AFTER THE MACRO DEFINITION, VALUES OF USER DEFINED EMT'S ;CAN BE INSERTED BETWEEN THE ANGLE BRACKETS. ;NOTE SEE RULES: ;E.G. .IRP P,<140,146> ;DEFINES EMT'S 140 AND 146 .MACRO GEMU5 VAL .IRP P,<> .IIF EQ,PHASE SUBST>,VAL .IIF NE,PHASE R50 >,P .ENDM .ENDM GEMU5 ;IF EMT'S HAVE BEEN ADDED AND THE IT SPEC CMPB (R0)+,(R0)+ ;CANT BE SAME BEQ MERROR TSTB (R0) ;ONLY TWO UNITS PLEASE BPL MERROR ;WRONG...ONLY TWO UNITS ; NOW WE HAVE VERIFIED THE COMMAND SYNTAX COMPLETELY MOVB DTABL,R1 ;SELECT OUTPUT UNIT JSR R5,MSET BIT #MTWRL,MTAS ;CHECK FOR WRITE LOCK BEQ COM14 ;OK, OUTPUT IS WRITE ENABLED JSR R5,MES ;WRITE LOCK ERROR + ERRMWL COM12.: BR COM12 ;ABORT COM14: JSR PC,REWIND ;REWIND OUTPUT TAPE MOVB DTABL+1,R1 ;SELECT INPUT UNIT JSR R5,MSET JSR PC,REWIND ;REWIND THE INPUARE USEDTO ADDRESS THESECOND PART ; INFO BLOCKS ;2 WORD 2 POINTS TO A TABLE OF VARIOUS DATA NEEDED BY RMON SUCH AS MAXEMT ;3 WORD3 AND 4 ARETHE THE FIRST WORDS BUILDING A SECOND PART INFO BLOCK ; A SECOND PART INFO BLOCK IS DEFINEDAS: ; WORD 1OF THE PAIR EQUALS THE NUMBER OF ENTRIES TO BE CHECKED ; I.E. ALL EMT'S SHOULD BE THERE ; WORD 2 OF THE PAIR POINTS TO THE PRIMARY CONTROL TABLE FOR THIS TYPE ; THE NAMES OF THESE TABLES ARE:EMPRIM,CLPRIM,ETC ; IT IS UP TO THE SYSTEM INITIALIZER TO DE R5,@(SP)+ CR.CDN: BR .+12 ;SWITCH CLEARED UPON E-O-F MOVB #4,CR.CDN ;AND IMMEDIATELY RESET BR CR.DXT ;BYPASSES USUAL END-CARD PROCESSING MOV CR.UBP,R0 ;SET USER BUFF PTR .IFDF BINARY ;FOR BINARY VERSION ... TSTB CR.ISW ;... CHECK IF BINARY READ BNE CR.BDN ;IF SO ACTION ACCRODINGLY .ENDC MOV CR.UBE,R1 ;FOR ASCII, SET END PTR .IFDF BLANKS ;... & PERHAPS CHECK SUPPRESS CR.ZSW: BR .+4 ;SWITCH ON? BR CR.ADN ;IF NOT NO SUPPRESSION CR.ESW: BR .+6 ;SWITCH INITED TOLINKER SHOULD ;BE ABLE TO LOAD THEM RESIDENT, THE TABLE ;STARTING AT LABEL GLOTAB HAS TO BE EXTENDED. ; THE TABLE GLOTAB DEFINES THE RADIX50 NAMES OF EMT'S. ;WHEN THERE REMAIN UNDEFINED GLOBALS,THE LINKER SEARCHES ;THE TABLE GLOTAB, AND THE TABLE INDEX ;DIVIDED BY TWO OF ANY TABLE ENTRY MATCHING AN UNDEFINED ;GLOBAL WILL BE THE NUMBER OF A EMT TO BE LOADED ;RESIDENT. ;TO ADD THE GLOBAL NAMES OF USER DEFINED EMT'S ;USE THE FOLLOWING RULES: ;1 SUBTRACT 100 FROM THE LOWEST DEFINED EMT ;2 IF TT UNIT ; NOW FOR THE MAIN LOOP OF THE COPY PASS MCOPY0: MOV #3,MCOPYX ;3 EOF'S MARK END-OF-DATA MCOPY1: MOV #DTPAR+6,R3 ;SET UP PARAMETER BLOCK FOR COPY MOV BUFSIZ,(R3) ;COMPUTE MAXIMUM RECORD SIZE SWAB (R3) ASL (R3) NEG (R3) ;NOW RECORD BYTE COUNT IS IN DTPAR+6 MOV #BUF,-(R3) ;SET UP BUFFER ADDRESS CMP -(R3),-(R3) ;BUMP POINTER TO DTPAR MOVB DTABL+1,R1 ;SELECT INPUT UNIT JSR R5,MSET MOV #MTRD,(R3) ;SET FOR READ JSR PC,MTGO ;DO THE READ MOV MTABRC,-(SP) ;SAVE BYTE COUNT REGISTTERMINE ; WHETHER IT NEEDS DATA FROM ADDITIONAL TABLES. ; ADDITIONAL TABLES ARE FOLLOWING THE PRIMARY ONE ; ;THE FIRST OF APRIMARY TABLE IS ITS LENGTH PHASE=1 .MACRO R50 LOC,R5V ZZZ=. .=LOC .RAD50 /R5V/ .=ZZZ .ENDM R50 .WORD NTYPES ;NUMBER OF TYPES IN THIS SECTION .WORD GINFO-PART2 ;GENERAL INFO EMSLOT: .WORD NONLEM ;NON LINED EMT'S ARE ONLY INTERESTING .WORD EMPRIM-PART2 ;POINTER TO PRIMARY TABLE KBSLOT: .WORD KBNT .WORD KBPRIM-PART2 DVSLOT: .WORD DVNUM .WORD DVPRIM-PART2 ALLOW CC. 73-80 SUB #8.,R0 ;OTHERWISE LOSE CC 73-80 CMP -(R0),(PC)+ ;TRAILING SPACES NOW SUPPRESSED .BYTE 240,240 BEQ .-4 TST (R0)+ ;ADJUST PTR WHEN DONE CR.ADN: .ENDC CLR -(R1) ;CLEAR REST OF BUFFER CMP R1,R0 BHI .-4 MOV (PC)+,@R1 ;FINALLY MOVE IN CR-LF .BYTE 215,12 CR.DXT: MOV CR,R0 ;GET DDB ADDRESS JMP @14(R0) ;TAKE COMPLETION EXIT .IFDF BINARY CR.BDN: MOV CR.IBS,R1 ;FOR BINARY, INIT INT PTR MOVB @R0,R2 ;EXIT IF EOF SEEN BMI CR.DXT ;ALSO SETS INTERRUPT FLAG JSR HIS NUMBER IS X,THEN EXTEND THE TABLE WITH X ZEROES ;3 ADD NEXT .RAD50 /EMX/ ; WHERE EMX IS THE GLOBAL NAME ;4 IF MORE THAN ONE EMT HAS BEEN DEFINED,REPLACE 100 BY THE VALUE ; OF THE EMT JUST DEFINED +1, AND TAKE THE NEXT EMT VALUE AS ; LOWEST EMT VALUE, AND REPEAT STEP 1. ; ;NOTE: ALL NUMBERS ARE OCTAL ; GLOTAB: .WORD GLOLST-GLOTAB ;LENGTH OF TABLE HEADER INCLUDED .RAD50 /EMT/ ; 0,WAITR .RAD50 /EMT/ ; 1,WAIT .RAD50 /RWN/ ;2 WRITE .RAD50 /RWR/ ;3 NYA .RAD50 /RWN/ ;4 READER MOVB DTABL,R1 ;SELECT OUTPUT DRIVE JSR R5,MSET TST R4 ;SEE IF EOF JUST SEEN BLT 20$ ;GO DO EOF SUB (SP)+,DTPAR+6 ;COMPUTE RECORD SIZE FOR WRITE MOV #MTWT,DTPAR ;SET FOR WRITE JSR PC,MTGO BR MCOPY0 ;CONTINUE COPY 20$: TST (SP)+ ;FLUSH MTABRC FROM STACK MOV #MTAC,R0 ;WRITE AN EOF RECORD MT.CMD MTWTE 21$: TSTB (R0) BPL 21$ ;WAIT FOR DONE DEC MCOPYX ;CHECK FOR CONSEQUTIVE EOF'S BGT MCOPY1 ;GO FOR MORE INPUT ; 3 EOF'S IS THE END-OF-DATA SO THE COPY IS DONE MDONE: MOVB .IF NDF,FTCLL .IF NDF,FTCLP CLNUM=0 ;WHEN BOTH CLOCKS ABSENT ZERO CLOCK MODULE COUNT .ENDC .ENDC CLSLOT: .WORD CLNUM .WORD CLPRIM-PART2 GINFO: .BYTE EMTIO .BYTE STDEMT-1+UDEMT ;THIS IS M.EMAX AFTER SVT DFUG ZZZ=. MONVER .IF GT,<.-ZZZ-5> .=ZZZ+5 .ENDC ZZZ=. .EVEN .IF NE,<.-ZZZ> .=.-1 .BYTE 0 .ENDC .EVEN USRTXT PC=%7 R5=%5 MOV R5,PC ;HERE DIFINE THE PRIMARY EMT TABLE CONSISTING OF ;RAD50 REPRESENTATIONS OF EMT'S A ZERO MEANS IGNORE ;THE EMT NOTE RMON5 ZEROPC,CR.BIN ;ELSE GO MOVE DATA TO USER MOV @#CR.SXT,R5 ;IF COME BACK, MORE READ REQD. JMP 4(R5) ;SO TAKE SYSTEM EXIT .ENDC ;SPECIAL CASE PROCESSING: ; A) ERROR ROUTINE: CR.ERR: CLRB @#CR.CSR ;STOP INTERRUPTS JSR PC,CR.NRY ;INFORM OPERATOR CR.RPT: JSR PC,CR.AGN ;IF RETURN TRY AGAIN BR CR.IXT ;... & EXIT FOR NOW ; B) END OF FILE CARD SEEN: CR.EOF: MOV CR,R1 ;GET DDB ADDRESS .IFNDF BINARY ;FOR SIMPLE VERSION ... MOV 10(R1),16(R1) ;... NO DATA READ ON EOF .ENDC .IFDF BINARY ;MA .RAD50 /RWR/ .RAD50 /INR/ ; 6,DATASET INITIALIZATION .RAD50 /RLS/ ; 7,DATASET RELEASE .RAD50 /TRA/ ; 10,TRAN PRCESSOR .RAD50 /BLO/ .RAD50 /SPC/ .RAD50 /STT/ .RAD50 /DIR/ .RAD50 /ALO/ .RAD50 /OPN/ .RAD50 /CLS/ .RAD50 /REN/ .RAD50 /DEL/ .RAD50 /APP/ .RAD50 /GAR/ .RAD50 /PRO/ .RAD50 /REC/ .WORD 0 .WORD 0 .PAGE .WORD 0,0,0,0,0,0 ;EMT'S 30-35 .WORD 0 .WORD 0 .RAD50 /SPE/ ; 40,MSB OVERLAY PROCESSOR, RESIDENT .RAD50 /GUT/ ; 41, GENERAL UTILITIES .RAD5 DTABL+1,R1 ;SELECT INPUT UNIT JSR R5,MSET JSR PC,REWIND ;REWIND INPUT MOVB DTABL,R1 ;SELECT OUTPUT UNIT JSR R5,MSET ; JSR PC,REWIND ;REWIND OUTPUT TST VERIFY ;ARE WE GOING TO VERIFY THE COPY? BPL COM12. ;NO VERIFY (OR VERIFY COMPLETE) JSR R5,MES ;TELL HIM THAT WE ARE STARTING + VPASS MOV #1,VERIFY ;INDICATE VERIFY PASS ASR BUFSIZ ;USE ONLY 1/2 BUFFER FOR VERIFY ASR DTPAR+6 ;DITTO MOV #MTRD,DTPAR ;READ FUNCTION ONLY DURING VERIFY ; VERIFY PASS MAIN LOOP MCOPY2: MOV #3,MES ELEMENTS ON PROCESSING THE TABLE EMPRIM: .WORD STDEMT*2 BBB=000 .REPT STDEMT RAD50N BBB BBB=BBB+1 .ENDM ;NOW ZERO NON EXISTANT EMT'S IN THE RADIX50 TABLE CFNOEM ;ZERO TABLE ENTRIES RESEMP ;ZERO LOADED ONES TOO .REPT UDEMT .WORD 0 .ENDM SEQ=0 .REPT UDEMSW+12/13 NUMMAC GEMU,\SEQ .ENDM .REPT UDEMRS+12/13 NUMMAC GEMU,\SEQ .ENDM ;NOW DEFINE THE SECONDARY TABLE ALL ZEROES EMSEC: .REPT STDEMT+UDEMT .WORD 0 .ENDM SPECEMT ;FILL IN SPECIAL CASES YBE SOME IF BINARY ... ADD #16,R1 ;SO MOVE TO UNUSED COUNT STORE MOV R0,@R1 ;... & COMPUTE VALUE REQD SUB CR.UBE,@R1 ASR @R1 ;... AS WORDS! .ENDC COM @R0 ;SET UNDERWAY FLAG TO PREVENT READING MORE CARDS CLRB CR.CDN ;BYPASS END-CARD PROCESSING FOR E-O-F CR.EXT: BISB #2,@#CR.CSR ;ALLOW REST OF CARD THRU BR CR.CXT ; C) CONTROL CARD SEEN: .IFNDF ONLY26&ONLY29 ;FOR DUAL PUNCH DRIVER ... CR.026: MOV #104,CR.TOS ;... SET TABLE OFFSET ... BR CR.EXT ;... & IGNORE REST OF CTL CARD CR0 /CVT/ ; 42,CONVERSION PROCESSOR .RAD50 /FOP/ .RAD50 /FCR/ .RAD50 /FCL/ .RAD50 /LUK/ .RAD50 /LBA/ .RAD50 /GMA/ .RAD50 /CBA/ .RAD50 /CKX/ .RAD50 /DLN/ .RAD50 /DCN/ .RAD50 /AP2/ .RAD50 /CSX/ .RAD50 /CSM/ .RAD50 /XIT/ .RAD50 /LDR/ .RAD50 /LD2/ .RAD50 /MTO/ .RAD50 /DMP/ .RAD50 /RUN/ ; 65, RUN PROCESSOR .RAD50 /CDT/ .RAD50 /BSF/ ;ADD USER DEFINED GLOBALS IN FRONT OF THE NEXT LINE GLOLST: ;IF NO NON STANDARD DEVICES HAVE TO BE ;DEFINED, THE EDITING OF THICOPYX ;SET FOR 3 EOF'S TO MARK END MCOPY3: MOV #BUF,DTPAR+4 ;SET UP BUFFER ADDR MOVB DTABL+1,R1 ;SELECT INPUT UNIT JSR R5,MSET JSR PC,MTGO ;READ INPUT UNIT MOV MTABRC,-(SP) ;SAVE FOR RECORD LENGTH CHECK MOVB DTABL,R1 ;SELECT OUTPUT UNIT JSR R5,MSET SUB DTPAR+6,DTPAR+4 ;USE TOP 1/2 OF BUFFER FOR THIS READ TST R4 ;WAS IT AN EOF? BLT 25$ ;YES..SO GET AN EOF JSR PC,MTGO ;READ RECORD FROM OUTPUT UNIT MOV (SP)+,R4 ;GET OLD LENGTH CMP MTABRC,R4 ;CHECK RECORD LENGTHS BNE VERROR ;PO.MACRO CFNOEM .ENDM .MACRO SUBST .ENDM KBPRIM: .WORD KBNUM*2 .RAD50 /TS/ ;60 HERTZ TIME COMMAND .RAD50 /TF/ ;FIFTY HERTZ TIME COMMAND .IRP P, .RAD50 /P/ .ENDM KBNUM=.-KBPRIM-2/2 .WORD "TI,"TI .IRP P, .WORD "P .ENDM .WORD 2,2,4,3,4,2,2,3,3 .WORD 1,1,1,1,1,1,1,1,1,1,1,1 .MACRO GSLOT X .IRP P, .IF DF,FT'P .RAD50 /P/ ;GENERATE RADIX50 DEVICE CODE .029: CLR CR.TOS BR CR.EXT .ENDC .IFDF BLANKS ;IN SUPPRESS VERSION CR.ZON: CLRB CR.ZSW ;...SET TO OVERRIDE BLANK SUPPRESSION BR CR.EXT ;AGAIN IGNORE REST OF CARD CR.EON: CLRB CR.ESW ;SET SWITCH TO IGNORE CC.73-80 BR CR.EXT .ENDC ;READER NOT READY SUBROUTINE: CR.NRY: MOV CR.NAM,-(SP) ;IDENTIFY DEVICE MOV (PC)+,-(SP) ;12-17-72 .BYTE 002,4 ;MSG S002 S FILE IS READY. ;OTHERWISE INSERT THE NUMBER (OCTAL) ;OF NONSTANDARD DEVICES ON THE NEXT LINE. UDDEV=1 ;REPLACE THIS BY OCTAL NUMBER ;OF NON STANDARD DEVICES. ;FOR EACH NON STANDARD DEVICE,THE ;MNEMONIC AND INTERRUPT VECTOR ADDRESS ;HAVE TO BE SPECIFIED. ;THE SPECIFICATION OF THESE ITEMS HAS TO BE DONE ;BY MEANS OF THE MACROS GDVUO, GVDU1 ;AND GDVU2 USING THE FOLLOWING RULES. ; 1 START DEFINING BY USING GDVU0, NEXT ; GDVU1, AND THEREAFTER GDVU2 ; 2 IN EACH MACRO, SPECIFICATIONS ;SSIBLE ERROR SUB DTPAR+6,R4 ;COMPUTE # OF BYTES TO COMPARE JSR PC,CHECK ;DO COMPARE BR MCOPY2 ;AND KEEP GOING ; MATCH EOF'S 25$: TST (SP)+ ;FLUSH STACK JSR PC,MTGO ;READ EOF (WE HOPE) TST R4 BPL VERROR ;NO EOF! IS ERROR OF COURSE DEC MCOPYX ;COUNT EOF'S BGT MCOPY3 ;CONTINUE VERIFY BR MDONE ;A OK...WE'RE DONE. ;SUBROUTINE TO VERIFY THE CONTENTS OF RECORDS, BYTE BY BYTE. ;R4 = NUMBER OF BYTES TO COMPARE CHECK: MOV #BUF,R0 ;FIRST BUFFER ADDRESS MOV BUFSIZ,R1 ASL R1 S .ENDC .ENDM .ENDM GSLOT .IF DF,FTMT FTQT=1 .ENDC DVPRIM: .WORD DVNUM*2 ;NUMBER OF DEVICES *2 .IF DF,FTDK .RAD50 /DKH/ .RAD50 /DKL/ .ENDC GSLOT SEQ=0 .REPT UDDEV NUMMAC DEV,\SEQ .ENDM CLPRIM: .WORD LLEN .IF DF,FTCLP .RAD50 /P / .ENDC .IF DF,FTCLL .RAD50 /L / .ENDC LLEN=.-CLPRIM-2 .IIF DF,FTCLP .WORD 300 .IIF DF,FTCLL .WORD 200 .IIF DF,FTCLP .WORD 'P .IIF DF,FTCLL .WORD 'L KBNT=KBNUM .END ;12-17-72 IOT ;... & CALL EDP CLRB @#177776 ;DROP CPU LEVEL TO LET IN KB: INTERRUPT;12-19-72 BIT #2000,@#CR.CSR ;WAIT FOR TRANSITION TO "ON-LINE" ;12-17-72 BEQ .-6 ;12-17-72 RTS PC ;TRY AGAIN IF COME BACK ; ;MISCELLANEOUS DEFINITIONS: CR.CSR=177160 CR.DB1=177162 CR.DB2=177164 CR.SXT=42 CR.RSV=44 CR.TBL: ;PARITY ASCII CONVERSION TABLE FOR 029 PUNCH .IFNDF ONLY26 .BYTE 240 ;SPACE .BY FOR ONLY 3 DEVICES CAN BE GIVEN ; 3 IF THERE ARE 3 OR MORE SPECIFICATIONS ; TO BE DONE, SPECIFY 3 IN THE CURRENT MACRO. ;THE MACROS GDVU0, GDVU1 AND GDVU2 ;PROVIDE THE FACILITY FOR 9 DEVICES. WHEN ;MORE DEVICES HAVE TO BE ADDED, ADD ;ADDITIONAL MACROS WITH NAMES STARTING ;WITH GDVU3,-.... ;HAVING THE SAME LAYOUT AS ;GDVU0, GDVU1 AND GDVU2. .PAGE ;HERE THE MNEMONIC AND INTERRUPT VECTOR ;ADDRESS OF UP TO 3 DEVICES CAN BE SPECIFIED. ;IF THE MNEMONICS AND INTERRUPT VECTOR ;ADDRESS ARE REWAB R1 ;BUF2=BUF+(BUFSIZ*512.) ADD R0,R1 ;R1 IS NOW SET UP CHECK0: CMPB (R0)+,(R1)+ ;DO A BYTE BY BYTE COMPARE BNE VERROR DEC R4 BGT CHECK0 ;CONTINUE FOR FULL RECORD RTS PC VERROR: JSR R5,MES ;TELL HIM THE COPIES BAD + BADCHK JMP COMCON ;ABORT EVERYTHING TOKNCT = 0 .MACRO TOKN STRING,ADDR .ASCII %'STRING'% .BYTE 0 ;END THE THING TOKNC \TOKNCT ;POINT TO NEXT TOKEN ON WORD BOUND .EVEN .WORD ADDR-GTOK0 ;WE FOUND IT TOKNCL \TOKNCT ;LABEL REFERENCE TOKNCT = TOKNCT+1 .TITLE MTDUMP V001B ; ; ; ; MAGTAPE DUMP UTILITY PROGRAM ; ; DAVID MCMILLEN ; ; 11/9/72 ; ; VERSION: 001B ; LAST EDIT: 11/24/72 ; ; ; (THIS PROGRAM IS DESIGNED TO RUN UNDER THE DOS-11 SYSTEM) ; ; ; ; ; THIS PROGRAM WAS WRITTEN TO USE THE DOS DEVICE DRIVER "MT:" FOR IT'S I/O, NO ; MATTER HOW DIFFICULT IT WAS TO DO IT THAT WAY. THIS ALLOWS NON-STANDARD ; MAGTAPE DRIVERS TO BE USED, AS LONG AS THEY ACT THE SAME WAY AS THE STANDARD ; ONE FOR THE .TRAN AND .SPEC FUNCTIONS. THIS ALSO TE 261 ;1 .BYTE 262 ;;2 .BYTE 63 ;3 .BYTE 264 ;4 .BYTE 65 ;5 .BYTE 66 ;6 .BYTE 267 ;7 .BYTE 270 ;8 .BYTE 240 ;EMPTY .BYTE 72 ;: .BYTE 243 ;# .BYTE 300 ;@ .BYTE 47 ;' .BYTE 275 ;= .BYTE 42 ;" .BYTE 71 ;9 ; .BYTE 60 ;0 .BYTE 257 ;/ .BYTE 123 ;S .BYTE 324 ;T .BYTE 125 ;U .BYTE 126 ;V .BYTE 327 ;W .BYTE 330 ;X .BYTE 131 ;Y .BYTE 240 ;EMPTY .BYTE 335 ;] .BYTE 254 ;, .BYTE 245 ;% .BYTE 137 ;_ .BYTE 276 ;> .BYTE 77 ;? SPECTIVELY: ;X1,X2,X3 AND IVA1,IVA2 AND IVA3 ;THEN EDIT THE LINE AFTER THE MACRO DEFINITION TO READ: ; .IRP P,<,,> .MACRO GDVU0 .IRP P,<> UDEVG P .ENDM .ENDM GDVU0 ;HERE THE MNEMONIC AND INTERRUPT VECTOR ;ADDRESS OF UP TO 3 DEVICES CAN BE SPECIFIED. ;IF THE MNEMONICS AND INTERRUPT VECTOR ;ADDRESS ARE RESPECTIVELY: ;X1,X2,X3 AND IVA1,IVA2 AND IVA3 ;THEN EDIT THE LINE AFTER THE MACRO DEFINITION TO READ: ; .IRP P,<,,> .MACRO .LIST ;****************************************************************** .NLIST .ENDM .MACRO TOKNC COUNT .BYTE TOKC'COUNT-. ;FORWARD POINTER .ENDM .MACRO TOKNCL COUNT TOKC'COUNT: .ENDM TOKETB: TOKN ^"DF",TOKDF TOKN ^"DC",TOKDC TOKN ^"DK",TOKDK TOKN ^"DP",TOKDP TOKN ^"DT",TOKDT TOKN ^"MT",TOKMT TOKN ^":",TOKCOL TOKN ^",",TOKCOM TOKN ^"<",TOKLRO TOKN ^"_",TOKLRO TOKN ^"/TR",TOKTRK ;TRACK SWTICH TOKN ^"/DI",TOKDIS ;DISK SWITCH TOKN ^"/PL",TOKDIS ;PLATTERS (=DISKSMEANS THAT THE DEVICE ; REGISTERS DO NOT HAVE TO BE AT ANY CERTAIN ADDRESS FOR THIS PROGRAM. ; ; ; ; ; .SBTTL *** "MTDUMP" MAGTAPE DUMP ROUTINES ; ; ; THIS SYSTEM PROGRAM ALLOWS THE USER TO DUMP,EXAMINE, & OTHERWISE ; MANIPULATE 7 OR 9 CHANNEL MAGTAPE. ; ; THE PROGRAM COMES UP, ANNOUNCES ITSELF, OPENS THE COMMAND I/O FILES, ; REQUESTS THE NAME OF THE OUTPUT FILE, OPENS THAT, INITIALIZES THE MAGTAPE ; DRIVER, AND THEN PRINTS OUT THE SIZE OF THE BUFFER THAT IS AVAILABLE. ; IT IS THEN REA .BYTE 132 ;Z ; .BYTE 55 ;- .BYTE 312 ;J .BYTE 113 ;K .BYTE 314 ;L .BYTE 115 ;M .BYTE 116 ;N .BYTE 317 ;O .BYTE 120 ;P .BYTE 321 ;Q .BYTE 240 ;EMPTY .BYTE 41 ;! .BYTE 44 ;$ .BYTE 252 ;* .BYTE 251 ;) .BYTE 273 ;; .BYTE 134 ;\ .BYTE 322 ;R ; .BYTE 246 ;& .BYTE 101 ;A .BYTE 102 ;B .BYTE 303 ;C .BYTE 104 ;D .BYTE 305 ;E .BYTE 306 ;F .BYTE 107 ;G .BYTE 110 ;H .BYTE 240 ;EMPTY .BYTE 333 ;[ .BYTE 56 ;. .BYTE 74 ;< .BGDVU1 .IRP P,<> UDEVG P .ENDM .ENDM GDVU1 ) TOKN ^"/RW",TOKRE ;RWIND FOR REWIND TOKN ^"/RE",TOKRE ;REWIND SWITCH TOKN ^"/SK",TOKSK ;SKIP FILE SWITCH .IF DF $$RS TOKN ^"/RS",RF11 ;RSTS SWITCH .ENDC TOKN ^"/BO",TKBOOT ;BOOTSTRAP SWITCH TOKN ^"/NO",TOKNOL ;NOLABEL SWITCH TOKN ^"/HE",TOKHLP ;HELP SWITCH TOKN ^"/NU",TOKNUM ;NUM SWITCH TOKN ^"/FI",TOKFI ;FIND SWITCH TOKN ^"/DA",TOKDAT ;DATE SWITCH .IF DF $$V4 TOKN ^"/V4",TOKV4A ;SPECIAL V4A SWITCH .ENDC TOKN ^"/VE",TOKVE ;VERIFY TRANSFER TOKN ^"/WL",TOKWL ;WRITE LOCK DISK DY TO ACCEPT COMMANDS. THE COMMANDS ARE: ; ; "MODE" Y WHERE "Y" IS: ; "ASCII" MEANING DUMP THE TAPE IN ASCII ; "BINARY" FOR OCTAL DUMPS OF WORDS ; "BYTE" FOR BOTH OCTAL AND ASCII DUMP OF EACH BYTE ; "RAD50" FOR RADIX 50 INTERPRETATION OF THE DATA ; ; "TRACK" N WHERE "N" IS THE NUMBER OF TRACKS ON THE TAPE (7 OR 9) ; (THIS IS USED TO PRODUCE AN ERROR MESSAGE IF THE ; WRONG TYPE OF A DRIVE IS BEING USED. IT IS A NO-OP IF ; THE CORRECT DRIVE IS BEING USED.) ; ; ; "DENSIYTE 50 ;( .BYTE 53 ;+ .BYTE 336 ;^ .BYTE 311 ;I .ENDC ;PARITY ASCII CONVERSION TABLE FOR "FIELDATA" PUNCH: ; COMPRESSED CARD CODE: ; BYTE BIT POSITIONS: 7 6 5 4 3 2-1-0 ; CARD ROWS PUNCHED: ^ 12 11 ^ 0 9 8 ^ 1,2,3,4,5,6,OR 7 .IFNDF ONLY29 ; COMPRESSED FIELDATA ; ASCII PRINTED CARD CODE PUNCH ; CODE CHARACTER (OCTAL) CODE .BYTE 240 ; SPACE .TITLE INPEC INPUT ALL FILES ON PEC DRIVE 0 ; ; (THEY GO INTO CURRENT UIC) ; ; (FILES ARE WRITTEN TO LOGICAL UNIT 'DSK', WHICH DEFAULTS TO 'DC') ; ; WRITTEN BY DAVE MCMILLEN ON MAY 14, 1973 ; .MCALL .PARAMS,.INIT,.OPENO,.RLSE,.WRITE,.CLOSE,.EXIT,.WAIT .PARAMS ; ; START: .INIT #DSKLB ; WC=167540 STAT=167542 COM=167544 MA=167546 ; RDY=200 BSY=100 REW=400 READ=1 ERR=4000 EOF=100000 BEOT=40000 OFL=20000 ; .MACRO SCOM ARG MOV #ARG,@#COM .ENDM .MACRO BITSTA ARG BIT #ARG,@(RK11 ONLY) TOKN ^"/FO",TOKFO ;PACK FORMAT SWITCH (RK OR RP) .BYTE 15,0 ;END OF LINE TOKEN .BYTE 4,0 ;NEXT TOKEN IS END OF LIST .WORD TOKEOL-GTOK0 ;END OF COMMAND .WORD 0,0 ;NULL TOKEN WITH 0 POINTER TO END IT GTOK: MOV #TOKETB,R1 ;POINTER TO TOKEN TABLE GTOKX: MOV R0,-(SP) ;SAVE POINTER TO INPUT STRING GTOK1: CMPB (R0)+,(R1)+ ;MATCH ON THIS CHAR? BEQ GTOK2 ;YES--SEE IF MATCH ALL THE WAY TSTB (R1)+ ;NO-ADVANCE POINTER TO NEXT TOKEN BNE .-2 ;END OF CURRENT TOKEN IS 0 BYTE MOVBTY" N WHERE "N" IS THE DENSITY OF THE 7 TRACK TAPE (200, 556, ; OR 800) ; ; ; "PARITY" Y WHERE "Y" INDICATES PARITY ("E" OR "O" FOR EVEN OR ODD) ; ; ; "DUMP" N WHERE "N" IS THE NUMBER OF RECORDS TO DUMP ; ; ; "BACKSPACE" N WHERE "N" IS THE NUMBER OF RECORDS TO BACKSPACE ; ; ; "FORWARDSPACE" N WHERE "N" IS THE NUMBER OF RECORDS TO FORWARD SPACE ; ; ; "SKIPFILE" N WHERE "N" IS THE NUMBER OF FILES TO SKIP ; ; ; * "BACKFILE N WHERE "N" IS THE NUMBER OF FILES TO BACKSPACE 0 BLANK .BYTE 261 ; 1 1 1 .BYTE 262 ; 2 2 2 .BYTE 063 ; 3 3 3 .BYTE 264 ; 4 4 4 .BYTE 065 ; 5 5 5 .BYTE 066 ; 6 6 6 .BYTE 267 ; 7 7 7 .BYTE 270 ; 8 10 8 .BYTE 240 ; EMPTY 11 8-1 .BYTE 246 ; & 12 8-2 .BYTE #STAT .ENDM ; BEGIN: SCOM REW BITSTAT RDY!BSY BNE OK MOV #-1,-(SP) MOV (PC)+,-(SP) .BYTE 2,1 ;A002 177777 IOT BR BEGIN OK: JSR PC,WAIT LOOP: CLR LEOF ZORK: MOV #FILB,@#MA MOV #7,@#WC SCOM READ JSR PC,WAIT CLR FILB-2 MOV #FILB-2,ZORK+2 CLR FILB+6 CLR FILB+10 MOV #FILB,R0 MOV FILIS,R1 CLR @#177570 CMP (R1)+,(R0) BNE NOPE CMP (R1)+,2(R0) BNE NOPE CMP (R1)+,4(R0) BNE NOPE MOV R1,FILIS .OPENO #DSKLB,R0 CLR R1 MOV #-1,@#177570 NOPE: MOV #-1,LEOF RLO (R1),R2 ;DISPLACEMTNT TO NEXT TOK BNE .+6 ;IF END OF LIST... GTERR: JMP COMERR ;....THAT'S BAD! ADD R2,R1 ;POINT TO NEXT TOKEN MOV (SP),R0 ;RESTORE POINTER TO START OF STRING BR GTOK1 ;CONTINUE LOOKING GTOK2: TSTB (R1) ;WAS THAT THE LAST CHAR IN TOKEN? BNE GTOK1 ;NO--SEE IF NEXT MATCHES TOO CMPB (R1)+,(SP)+ ;R1_R1+1, SP_SP+2 MOVB (R1),R2 ;POINTER TO NEXT TOKEN ADD R2,R1 ;THIS DISPATCH WORD PREECEEDS NEXT TOK ADD -(R1),PC ;DISPATCH POS. IND. MANNER GTOK0: ;RELOCATIO ; ; ; "NEWDIR" N WHERE "N" IS THE UNIT TO PLACE A NEW DIRECTORY ON ; ; ; "DIRECTORY" N WHERE "N" IS THE UNIT TO GIVE A DIRECTORY LISTING OF ; ; ; "FIND" Y WHERE "Y" IS THE FILE NAME TO FIND ON THE TAPE. (THE ; TAPE IS ASSUMED TO BE FILE STRUCTURED. THE HEAD IS LEFT ; POSITIONED AT THE FIRST BLOCK OF DATA IN THE FILE.) ; THE FILE NAME ("Y") IS OF THE FORM AXXXXX.XXX WHERE ; "A" IS ANY ALPHABETIC CHARACTER, AND "X" IS ANY RADIX ; 50 LEGAL CHARACTER. ; ; ; "FFIND" Y 275 ; = 13 8-3 .BYTE 047 ; ' 14 8-4 .BYTE 072 ; : 15 8-5 .BYTE 276 ; > 16 8-6 .BYTE 300 ; @ 17 8-7 .BYTE 071 ; 9 20 9 .BYTE 060 ; 0 40 0 .BYTE 257 ; / 41 0-1 .BYTE 123 ; S 42 0-2 .BYTE 324 ; T 43 0-3 .BYTE 125 ; U OP: MOV #BUF,@#MA MOV #400,@#WC SCOM READ JSR PC,WAIT TST R1 BNE RLOOP .WRITE #DSKLB,#BUFFR .WAIT #DSKLB BR RLOOP CLOSE: TST R1 BNE LOOP .CLOSE #DSKLB BR LOOP WAIT: BITSTA RDY!BSY BEQ GONE WHOLD: BITSTA RDY BNE WHOLD WLOOP: BITSTA RDY BEQ WLOOP BITSTA EOF BNE EOFIN BITSTA ERR!OFL!BEOT BNE ERROR RTS PC EOFIN: CLR @#STAT INC LEOF TST LEOF BEQ FILED SCOM REW .EXIT FILED: TST (SP)+ BR CLOSE ERROR: MOV @#STAT,-(SP) DEAD: MOV (PC)+,-(SP) .BYTE 77,1 IN FACTOR TOKDC: JSR PC,MAKERC ;FORCE I/O ON RC DISK TOKDF: TST DSKDAE ;IS IT RK11 ALREADY? BGT GTERR ;IF SO COMPLAIN.. TOKDF0: MOV #DFR,R2 ;TOKEN SEEN WAS "DF" TOKDF1: BIT #RHS,FLAGS ;ASSUME WE ARE ON RIGHT SIDE--SEE IF WE ARE BNE .+4 ;WE ARE ASL R2 ;WRONG ASSUMPTION--LEFT FLAG=RIGHT*2 BIS R2,FLAGS ;SET THE "SEEN" BIT ON APPROPRIATE SIDE TOKDF2: JSR R5,SKIPPER ;SKIP TO END OF TOKEN + COL+COM+EOL ;STOP SKIPPING ON [: , ] BR GTOK ;GO BACK FOR MORE TOKMT: BIT #MTAPE,FLAGS ;IS WHERE "Y" IS THE SAME AS FOR "FIND". "FFIND" ACTS THE ; SAME AS "FIND", BUT IT DOES NOT REWIND THE TAPE. ; ; ; "WEOF" N WHERE "N" IS THE NUMBER OF END-OF-FILES TO WRITE ; ; ; "REWIND" N WHERE "N" IS THE UNIT TO REWIND ; ; ; "RUN" N WHERE "N" IS THE UNIT NUMBER OF THE UNIT TO USE FOR ; ALL COMMANDS THAT DO NOT INCLUDE A UNIT NUMBER. ; ; ; "FROM" Z ; OR ; "TO" Z WHERE "Z" IS THE NAME OF ANY DISK IN THE SYSTEM, OR ; THE NAME OF ANOTHER MAGTAPE DRIVE (OTHER THA44 0-4 .BYTE 126 ; V 45 0-5 .BYTE 327 ; W 46 0-6 .BYTE 330 ; X 47 0-7 .BYTE 131 ; Y 50 0-8 .BYTE 240 ; EMPTY 51 0-8-1 .BYTE 137 ; _ 52 0-8-2 .BYTE 254 ; , 53 0-8-3 .BYTE 050 ; ( 54 0-8-4 .BYTE 245 ; % 55 0-8-5 .BYTE 134 ; \ 56 0OT RTS PC GONE: CLR -(SP) BR DEAD LEOF: 0 FILIS: .+2 .RAD50 /MACRO MACODT MACGLSUBSMACFASTMTMACEDITCLMACQQQQQQQQQ/ 0 DSKLB: 0 .RAD50 /DSK/ 1 .RAD50 /DC/ ; 0,0 FILB: .BLKW 7 ; BUFFR: 1000,3,1000 BUF: .BLKW 400 .END START MTCOPY POSSIBLE? BNE 10$ ;YEAH...AVOID CHECK BIT #DTR+DTL,FLAGS ;CAN'T HAVE BOTH MT AND DT BNE GTERR ;ERROR IF WE DO BIS #MTAPE,FLAGS ;SET MAGTAPE SEEN FLAG 10$: CMPB (R0),#': ;WAS A UNIT # GIVEN? BNE TOKDT0 ;IF SO GO ON MOVB #'0,-(R0) ;FORCE MT0: FOR MT: BR TOKDT0 ;REST IS COMMON WITH DECTAPE TOKCOL = GTOK ;FOR COLON, JUST PASS IS BY TOKCOM = GTOK ;FOR COMMA, JUST PASS IT BY TOKLRO: BIS #RHS,FLAGS ;SHIFTING TO RIGHT HAND SIDE BR GTOK ;GO BACK FOR MORE TOKWL: BIS #WL,FLN THE ; CURRENT UNIT) IN THE STANDARD DOS FORM (I.E., "DF:", ; "DK0:", "DPA:", "MT4:", ETC.). THIS COMMAND WILL ; EITHER TAKE ALL FILES ON THE SPECIFIED DEVICE AND MOVE ; THEM "FROM" THE DEVICE TO THE MAGTAPE, OR IT WILL ; TAKE ALL FILES ON THE MAGTAPE AND MOVE THEM "TO" THE ; SPECIFIED DEVICE. THE FUNCTION WILL ONLY WORK ; ON THE CURRENT USER'S DISK UIC, BUT WILL COVER ALL UICS ; ON THE MAGTAPE. IN OTHER WORDS, ANY FILE ON THE MAGTAPE ; WOULD BE TRANSFERED TO THE DISK OR ANOTHE-8-6 .BYTE 042 ; " 57 0-8-7 .BYTE 132 ; Z 60 0-9 .BYTE 055 ; - 100 11 .BYTE 312 ; J 101 11-1 .BYTE 113 ; K 102 11-2 .BYTE 314 ; L 103 11-3 .BYTE 115 ; M 104 11-4 .BYTE 116 ; N 105 11-5 .BYTE 317 ; O 106 11-6 .BYTE 120 ; P 107 11-7 ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A ; ;FILENAME - XIT .TITLE EM.060 ;EXIT PROCESSOR VERSION 1 DEC 70 ; ; CALLED FROM USER PROGRAM AT END OF JOB BY:- ; EMT 60 ; ; MERELY LOADS TRANSIENT MONITOR (TMON) INTO ; TOP OF MEMORY, ON THE ASSUMPTION THAT THIS ; IS STORED AS THE SECOND ENTRY IN THE MONITOR ; LIBRARY ON DISK. A SATISFACTORY LOAD CAUSES ; TRANSFER OF CONTROL TO TMON. ; ; TMON WILL BE RESPONSIBLE FOR USER PROGRAM TIDY-UP ; AND FOR ACCEPTAGS ;SET WRITE LOCK BIT BR GTOK TOKVE: MOV #-1,VERIFY ;SET VERIFY FLAG BR TOKDF2 ;PASS OFF REST OF SWITCH TOKEOL: RTS PC ;END THE SCANN! TOKDIS: JSR PC,TOKA2I ;TOKEN WAS "/DISK" MOV R2,DISKS ;SAVE # OF DISKS BR GTOK ;GET SOME MORE TOKNUM: JSR PC,TOKA2I ;TOKEN WAS "/NUM" MOV R2,NUM ;GET NUMBER OF TRACKS TO SAVE/READ MOV R3,NUM+2 ; TOKN2: BR GTOK ;AND GO BACK TOKTRK: JSR PC,TOKA2I ;TOKEN WAS "/TRACK" MOV R2,TRACK ;SAVE STARTING DISK TRACK TO LOAD/SAVE MOV R3,TRACK+2 ; R MAGTAPE, BUT ; ONLY THE CURRENT USER'S FILES WOULD BE TRANSFERED TO ; THE MAGTAPE FROM THE DISK OR ANOTHER MAGTAPE. THIS IS A ; USEFUL FUNCTION FOR BACKUP OF FILES. ; ; ; "ECHO" Y WHERE "Y" IS EITHER "ON" OR "OFF". THIS COMMAND CONTROLS ; THE ECHOING OF THE COMMANDS AND MESSAGES TO THE LISTING ; DEVICE. ; ; ; "EXIT" CLOSE ALL DATA SETS AND RETURN CONTROL TO THE TRANSIENT ; MONITOR. ; ; ; ; NOTES: ; ; 1) THE DEFAULT CONDITION IS TO BE OPERATING ON UNIT 0. IF USE OF .BYTE 321 ; Q 110 11-8 .BYTE 240 ; EMPTY 111 11-8-1 .BYTE 240 ; EMPTY 112 11-8-2 .BYTE 044 ; $ 113 11-8-3 .BYTE 252 ; * 114 11-8-4 .BYTE 335 ; ] 115 11-8-5 .BYTE 273 ; ; 116 11-8-6 .BYTE 336 ; ^ 117 11-8-7 .BYTE 322 ; R 120 11-9 ; NOTE: SINCE THE [11-0] SERIES IS OMITTEANCE OF NEXT TASK VIA KEYBOARD ; COMMAND. ; ; ON EXIT TO TMON, THE STACK WILL BE SET IMMEDIATELY ; BELOW ITS LOAD POINT & R5 WILL BE SET TO SVT.+14(DCO) ; ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 CDB=50 CDQ=52 DCO=14 DDL=50 HICOR=4 PSW=177776 SVT=40 TRMNL=400 .WAIT=EMT+1 ; .GLOBL XIT .BYTE 0,-1 ;IN USE/NO SHARE SWITCHES. XIT: BR XIT00 ;BYPASS PARAMETERS TMNADR: .WORD 0 ;DISK ADDRESS OF TMON TMNSIZ: .WORD 0 ;SIZE OF TMON (BYTES) XIT00: BR GTOK ;GO BACK TOKA2I: JSR R5,SKIPPER ;SKIP TO COLON IN STRING + COL INC R0 ;SKIP PAST THE COLON JSR PC,ATOI ;CONVERT TO INTEGER RTS PC TOKSK: JSR PC,TOKA2I ;SET TO SKIP N FILES MOV R2,MTSKIP ;ON MAGTAPE... BR TOKN2 ;AND RETURN TOKV4A: MOV #-1,V4A ;SET V4A FLAG BR TOKDF2 ;AND RETURN TOKDT: BIT #MTAPE,FLAGS ;CAN'T MIX DT AND MT BNE GTERR1 ;BAD, BAD TOKDT0: CMPB (R0),#'0 ;"DT" SEEN--UNIT SPECIFIED? BLO TOKDT2 ;NO--SET DT SEEN FLAG & GO BACK CMPB (R0),#'7 ;MAYBE-- ANY ; OTHER UNIT IS DESIRED, THE "RUN" COMMAND MUST BE GIVEN, ; UNLESS THE COMMAND SPECIFIES A CERTAIN UNIT NUMBER. ; ; 2) THE NUMBERS ARE GIVEN IN THE SAME SYNTAX AS FOR THE ASSEMBLER (I.E., ; FOR AN OCTAL NUMBER, NO DECIMAL POINT, FOR A DECIMAL NUMBER, ; FOLLOW THE NUMBER WITH A DECIMAL POINT.) ; ; 3) ALL COMMANDS MAY BE ABBREVIATED TO TWO CHARACTERS, WITH THE ; EXCEPTION OF THOSE MARKED WITH AN ASTERISK ("*"). ; ; 4) ALL NUMBERS DEFAULT TO A ONE (1) IF THEY ARE LEFT OUT, WITH THE ;D, THE DRIVER STRIPS ; AN OCTAL 40 FROM THE FOLLOWING COMPRESSED CODES BEFORE INDEXING. ; THUS, THE LETTER 'C' IS INTERPRETED AS OCTAL 143, EVEN THOUGH ; THE CARD READER COMPRESSED CODE IS OCTAL 203. .BYTE 053 ; + 200 12 .BYTE 101 ; A 201 12-1 .BYTE 102 ; B 202 12-2 .BYTE 303 ; C 203 12-3 .BYTE 104 ; D 204 12-4 .BYTE 305 ; E 205 MOV @#SVT,R1 ;GET SVT MOV DCO(R1),R4 ;GET FIRST INITED DDB XIT05: BEQ XIT20 ;NO MORE DDB'S TST @R4 ;THIS DDB BUSY? BEQ XIT10 ;NO-BRANCH MOV -2(R4),R5 ;POINTER THE DRIVER BIT #TRMNL,2(R5) ;THIS DEVICE A TERMINAL? BEQ XIT15 ;NO-BRANCH CLR @R5 ;FREE DRIVER AND DDB, CLR @R4 ;THUS CANCELLING THE I/O XIT10: MOV -10(R4),R4 ;GET NEXT DDB BR XIT05 XIT15: MOV R4,-(SP) ;SAVE DDB ADDRESS MOV SP,R5 ;...AND POINTER IT MOV R5,-(SP) ;FOR THE WAIT .WAIT TST (SP)+ ;CLEAN UP THE STACK BHI TOKDT2 ;NO MOVB (R0)+,R2 ;YES--ENTER IN DTABLE IN FIRST OPEN SLOT SUB #'0,R2 ;CONVER TO BINARY MOV #DTABL,R3 ;LOCATE TABLE TOKDT1: TSTB (R3)+ ;THIS ENTRY SET? BPL TOKDT1 ;YES--KEEP LOOKING MOVB R2,-(R3) ;NO--REPLACE -1 BYTE WITH UNIT # TOKDT2: CMPB (R0)+,#': ;NEXT CHAR MUST BE COLON BNE GTERR ;IF NOT ITS AN ERROR MOV #MTNAM0+4,R1 ;R1 POINTS TO NAME CLR -(R1) ;CLEAR NAME INITIALLY CLR -(R1) MOV #55533,R2 ;LOOP CONTROL FLAG TOKDT3: MOVB (R0)+,R3 ;GET NEXT CHAR CMPB R3,#' EXCEPTION OF THOSE REFERRING TO UNIT NUMBERS. THE DEFAULT FOR ; THESE ARE ZERO (0). .SBTTL *** MACRO DEFINITIONS AND ASSIGNMENTS ; ; MACROS USED FROM THE SYSTEM MACRO FILE: ; .MCALL .INIT,.READ,.WRITE,.WAIT,.WAITR,.CLOSE,.RLSE,.TRAN,.EXIT .MCALL .PARAM,.SPEC,.STAT,.MONR,.MONF,.DATE,.OPEN,.RADPK,.RADUP ; ; .GLOBL CVT. ;NEED THE CONVERSION ROUTINES FROM DOS .GLOBL TRA. ;NEED THE .TRAN ROUTINE .GLOBL SPC. ;NEED THE SPECIAL FUNCTIONS ; ; ; ; .OPENI MACRO ; .MACRO .OPENI .LBLCK,.F 12-5 .BYTE 306 ; F 206 12-6 .BYTE 107 ; G 207 12-7 .BYTE 110 ; H 210 12-8 .BYTE 240 ; EMPTY 211 12-8-1 .BYTE 240 ; EMPTY 212 12-8-2 .BYTE 056 ; . 213 12-8-3 .BYTE 251 ; ) 214 12-8-4 .BYTE 333 ; [ 215 12-8-5 .BYTE 074 ; < 216 12-8-6 .BYTE 243 ; # 217 BR XIT10 ;GET NEXT DDB XIT20: MOV PC,R0 ;GET POINTER TO DDB ADD #XITDDB+4-.,R0 MOV TMNADR,(R0)+ ;MOVE IN START BLOCK NUMBER MOV HICOR(R1),@R0 MOV TMNSIZ,R4 BIT #1,R4 BEQ XIT25 ;COMPUTE BUFFER ADDRESS SO INC R4 ;THAT TMON IS LOADED AS XIT25: SUB R4,@R0 ;HIGH AS POSSIBLE MOV @R0,SP ;SET UP THE STACK POINTER CLR -(SP) ;LOW PRIORITY PSW MOV (R0)+,-(SP) ;START ADDRESS OF TMON ASR R4 NEG R4 ;CONVERT BYTES TO -WORDS BIC #3,R4 ;MAKE CERTAIN THAT IT IS A MULTIPLE OF 4 MOV R4,A ;CHAR MUST BE A-Z OR 0-9 BLT TOKDT4 CMPB R3,#'Z BLE TOKDT5 ;ITS A-Z TOKDT4: CMPB R3,#'0 ;0-9? BLT TOKDT7 ;IF NOT EXIT LOOP CMPB R3,#'9 BGT TOKDT7 ;EXIT LOOP IF NOT SUB #22-100,R3 ;0-9 CORRECTION TOKDT5: SUB #100,R3 ;A-Z CORRECTION TOKDT6: ASRB R2 BCC TOKDT8 ;BRANCH IF NO MULTIPLY NEEDED ASL R3 ;MULTIPLY R3 BY 40. ASL R3 ASL R3 MOV R3,R4 ASL R3 ASL R3 ADD R4,R3 ;ALL DONE BR TOKDT6 ;CHECK IF MORE SHIFTING NEEDED TOKDT8: CMP R1,#MTNAM0+4 ;ARE WE PAST THE SIXTH BLCK .OPEN .LBLCK,.FBLCK ;AND OPEN IT UP .ENDM ; ; .OPENO MACRO ; .MACRO .OPENO .LBLCK,.FBLCK .OPEN .LBLCK,.FBLCK ;SAME AS FOR OPENI, JUST A DIFFERENT OPEN CODE .ENDM ; ; ; ; REGISTER ASSIGNMENTS: ; .PARAM ; .SBTTL *** PROGRAM INITIALIZATION AND SETUP ; START: .INIT #CMILB ;INITIALIZE THE COMMAND INPUT LINK BLOCK .INIT #CMOLB ;INIT THE COMMAND OUTPUT LINK BLOCK ; .OPENO #CMOLB,#CMOFB ;OPEN UP THE OUTPUT COMMAND FILE .OPENI #CMILB,#CMIFB ;AND THE INPUT COMMAND FILE ; .W 12-8-7 .BYTE 311 ; I 220 12-9 ; ALSO NOTE: THE CHARACTERS [?] AND [!] HAVE COMPRESSED CODES OF ; OCTAL [240] AND [140], RESPECTIVELY, MAKING THEM UNIQUE ; CHARACTERS OUTSIDE THE EVALUATION RANGE OF THE DRIVER. THUS ; SPECIAL CODE HAS BEEN INSERTED IN THE DRIVER TO DETECT THESE ; TWO CHARACTERS. .ENDC ;INTERNAL BUFFER FOR BINARY STORAGE: .IFDF BINARY CR.BUF: .IFNDF MARKS CR.BSZ=120. .ENDC .IFDF MARKS CR.BSZ=60. .ENDC .=.+(R0)+ ;AND ENTER IN DDB TST (R0)+ ;POINTER COMPLETION RETURN MOV PC,R4 ADD #XIT30-.,R4 ;COMPUTE COMPLETION ADDRESS MOV R4,@R0 ;AND ENTER IN DDB SUB #16,R0 ;POINTER TO DDB-2 MOV DDL(R1),R4 ;POINTER SYSTEM DRVR IN DDL MOV 2(R4),(R0)+ ;ENTER CORE ADDR IN DDB MOV #10,R1 ;SET CODE TO TRANSFER MOV R0,-(SP) ;SAVE DDB POINTER MOV @#CDB,-(SP) ;CALL THE DRIVER JSR PC,@(SP)+ MOV (SP)+,R0 ;RETRIEVE DDB POINTER BR . ;WAIT FOR INTERRUPT XIT30: ADD #20,SP ;CLEAR RETURN STATUS TST 12(R0CHAR ? BEQ TOKDT3 ;YES ADD R3,(R1) ;STORE CHARACTER ASRB R2 BCS TOKDT3 ;TEST FOR THIRD CHAR TST (R1)+ ;GO TO NEXT NAME WORD SWAB R2 ;NEW FLAGS BR TOKDT3 ;CONTINUE TOKDT7: DEC R0 ;RESCAN LAST CHAR MOV #DTR,R2 ;NOW SET THE DT SEEN ON RIGHT SIDE BIT JMP TOKDF1 ;AND SEE IF REALLY ON RIGHT SIDE GTERR1: JMP GTERR TOKDAT: JSR PC,TOKA2I ;GET DAYS FOLLOWING COLON TST R2 ;CANT BE 0 BEQ GTERR1 CMP R2,#31. ;IS HE PLAYING GAMES? BGT GTERR1 ;IF SO ERROR MOV R2,-(SP) ;SAVRITE #CMOLB,#TITLE ;TELL THE WORLD WHO WE ARE, ASK FOR THE LISTING ASKOTT: .READ #CMILB,#COMBUF ;DEVICE/FILE NAME .WAIT #CMILB ;WAIT FOR IT ALL TO SHOW UP JSR R5,SETGET ;SET UP TO PICK THE CHARACTERS UP .WORD COMBUF ;FROM THIS BUFFER BR ASKOUT ;IF ERROR IN SETUP, ASK THE QUESTION AGAIN JSR PC,GETCNS ;GET THE FIRST CHARACTER THAT IS NOT A SPACE CMP R5,#12 ;IS IT A TERMINATOR? BEQ ASKODF ;IF SO, SUPPLY THE DEFAULT OF "LP:" MOVB R5,RAD501 ;START SETTING UP FOR RADIX50 CONVERSION JSR PCR.BSZ .ENDC .END ) ;TRANSFER SUCCESSFUL? BPL XIT35 ;YES-BRANCH IOT ;CAUSE A HALT (@(SP+2)=0) XIT35: MOV @#CDQ,-(SP) JSR PC,@(SP)+ ;FREE THE DRIVER MOVB #340,@#PSW ;RAISE PRIORITY CLR XIT-2 ;FREE MSB CLR XIT-4 RTI ;PASS CONTROL TO TMON .WORD 0,0,0,0 XITDDB: .WORD 0,0,0,0,0,4,0,0,0,0,0,0 .END MOV (SP)+,R0 ;RETRIEVE DDB POINTER BR . ;WAIT FOR INTERRUPT XIT30: ADD #20,SP ;CLEAR RETURN STATUS TST 12(R0) ;TRANSFER SUCCESSFUL? BPL XIT35 ;YES-BRANCH IOT ;CAUSE A HALT (@(SP+2)=0) XE DAYS MOV #TOKETY,R1 ;SET R1 TO POINT TO MONTH TABLE MOV #-1,LPYFLG ;SET LEAP YEAR FLAG JMP GTOKX TOKDEC: ADD #30.,(SP) ;ADD IN DAYS PREECEDING IN YEAR TOKNOV: ADD #31.,(SP) TOKOCT: ADD #30.,(SP) TOKSEP: ADD #31.,(SP) TOKAUG: ADD #31.,(SP) TOKJUL: ADD #30.,(SP) TOKJUN: ADD #31.,(SP) TOKMAY: ADD #30.,(SP) TOKAPR: ADD #31.,(SP) TOKMAR: ADD #28.,(SP) MOV #3,LPYFLG ;RESET LEAP YEAR FLAG... TOKFEB: ADD #31.,(SP) TOKJAN: JSR PC,ATOI ;GET YEAR BIT LPYFLG,R2 ;CHECK FOR LEAP YEAR CORRECTIC,GETC ;PICK THE NEXT CHARACTER CMP #40,R5 ;IS IT A SPACE? BEQ ASKOUT ;YES - TRY AGAIN MOVB R5,RAD502 JSR PC,GETUNT ;GET A NUMBER WITH A DEFAULT OF ZERO MOVB R0,OUTDEV-1 ;SET THE UNIT NUMBER IN THE LINK BLOCK CMP #':,R5 ;WAS THE DELIMITING CHARACTER A ":"? BNE ASKOUT ;NO - TRY AGAIN MOVB #40,RAD503 ;LAST CHARACTER IS A SPACE JSR PC,ASCRAD ;CONVERT ASCII TO RADIX 50 BR ASKOUT ;ERROR IN CONVERSION MEANS RETRY MOV R4,OUTDEV ;SET THE DEFAULT OUTPUT DEVICE ; ASKOIN: .INIT #OUTLB ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; DISK FILE STRUCTURE PROGRAM ; V003B ; DIGITAL EQUIPMENT CORP. ; COPYRIGHT 1971 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 R6=%6 R7=%7 PC=%7 MAPREG =R1 BLKREG =R2 FIB =R2 BIBREG=R0 DRVREG=R5 DATREG=R4 RTMP=R5 ADR=R4 OPNIFLG=4 OPNUFLG =1 OPNEFLG =3 OPNOFLG =2 OPNAFLG =5 OPNCFLG=13 LOGNAM=2 IN=4 OUT=2 EOF=40000 IT35: MOV @#CDQ,-(SP) JSR PC,@(SP)+ ;FREE THE DRIVER MOVB #340,@#PSW ;RAISE PRIORITY CLR XIT-2 ;FREE MSB CLR XIT-4 RTI ;PASS CONTROL TO TMON .WORD 0,0,0,0 XITDDB: .WORD 0,0,0,0,0,4,0,0,0,0,0,0 .END ON BNE .+4 INC (SP) ;CORRECT FOR FEB 29 CMP R2,#99. BGT GTERR1 ;BAD YEAR SUB #70.,R2 BLT GTERR1 ;BAD YEAR TOKDA1: BEQ TOKDA2 ADD #1000.,(SP) ;CORRECT FOR YEAR-1970 DEC R2 BR TOKDA1 TOKDA2: MOV (SP)+,MTDATE ;SAVE DATE JMP GTOK ;AND RETURN TOKETY: TOKN ^"-JAN-",TOKJAN TOKN ^"-FEB-",TOKFEB TOKN ^"-MAR-",TOKMAR TOKN ^"-APR-",TOKAPR TOKN ^"-MAY-",TOKMAY TOKN ^"-JUN-",TOKJUN TOKN ^"-JUL-",TOKJUL TOKN ^"-AUG-",TOKAUG TOKN ^"-SEP-",TOKSEP TOKN ^"-OCT-",TOKOCT TOKN;INITIALIZE THE OUTPUT LINK BLOCK .STAT #OUTLB ;FIND OUT THE STATUS OF THE DEVICE BIT #2,(SP) ;OUTPUT ALLOWED? BEQ OUTERR ;NO - OUTPUT FILE ERROR BIT #20,(SP) ;ASCII ALLOWED? BEQ OUTERR ;NO - ERROR MOV (SP)+,R0 ;START TO CLEAN OFF THE STACK CMP (SP)+,(SP)+ ;THE STACK IS NOW CLEAN TST R0 ;FILE ORIENTED? BPL NOUTFL ;NO - NO OUTPUT FILE NAME NEEDED MOV #OUTFB,R0 ;SET UP TO JSR PC,MAKNAM ;MAKE A FILE NAME IN THE FILE BLOCK BR OUTERR ;NO NAME - ERROR NOUTFL: .OPENO #OUTLB,#OUTFB ; FIB ASSIGNMENTS NXTBLK =0 HOWOPEN =2 BEGEXT =4 TYPE =6 STRT =12 LENGTH =14 LAST =16 DIRITM =20 DIRBLK =22 IF =26 CBMPTR =30 FLINK =32 ; BIB ASSIGNMENTS UFDPTR =2 MYWORD =2 BLOCK =4 BUFADR =6 WC =10 STATUS =12 UNIT =13 DEVNO =13 DUNRTN =14 BUFPTR =16 BC =20 CKSUM =22 MINE2 =22 DATPTR =24 FIBLNK =26 ; DRIVER ASSIGNMENTS SBS =4 DSKTFR =10 MFDPTR =16 BMPTR =20 ; OTHER ASSIGNMENTS S.EXIT=42 S.RSAV=44 S.RRES=46 S.CD ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; DISK FILE STRUCTURE PROGRAM ;VERSION NUMBER V005A ; 001 ; DIGITAL EQUIPMENT CORP. ; COPYRIGHT 1971 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 R6=%6 R7=%7 PC=%7 MAPREG =R1 BLKREG =R2 FIB =R2 BIBREG=R0 DRVREG=R5 DATREG=R4 RTMP=R5 ADR=R4 OPNIFLG=4 OPNUFLG =1 OPNEFLG =3 OPNOFLG =2 OPNAFLG =5 OPNCFLG=13 LOGNAM=2 IN=4 OUT= ^"-NOV-",TOKNOV TOKN ^"-DEC-",TOKDEC .WORD 0,0 ;TOKEN IS BOOTSTRAP... TKBOOT: JSR R5,REGSAV JSR PC,INICR ;DO CR/LF 1$: TSTB @I.TPS ;WAIT FOR READY BPL 1$ JSR R5,REGRES JSR R5,SKIPPER ;SKIP TO COLON IN STRING... + COL MOV #TOKETX,R1 ;POINT INTO NEW TABL... JMP GTOKX ;AND CONTINUE TOKETX: TOKN ^":DF",RF11 ;BOOT FROM RF11 TOKN ^":DT",TC11 ;BOOT FROM DECTAPE TOKN ^":DK",RK11 ;BOOT FROM RK11 DISK TOKN ^":DC",RC11 ;BOOT FROM RC11 DISK TOKN ^":MT",TM11 ;BOOT FROM MAGTAPE T ;OPEN THE OUTPUT DEVICE UP FOR OUTPUT CLRB RUNUNT ;START OUT ON UNIT ZERO .INIT #MTLB ;INIT THE MAGTAPE HANDLER .MONF ;FIND OUT HOW BIG THE MONITOR IS NOW MOV (SP)+,R0 ;SET UP FOR FINDING OUT HOW BIG THE BUFFER CAN ;ALLOW FOR A DISK DRIVER AND BUFFER PLUS ADD #3201,R0 ;64 WORDS OF STACK SPACE BIC #1,R0 ;MAKE CERTAIN THAT IT IS EVEN MOV R0,BUFADR ;SET UP THE BUFFER ADDRESS MOV SP,R1 MOV R0,SP SUB R0,R1 ;SIZE OF THE BUFFER TST R1 ;IS IT OVER 16K? BPL BUFADJ ;NO - NOT EVB=50 S.CDQ=52 GETBUF=54 S.RBUF=56 DKDRVR=1540 DTDRVR=4100 DKFULL =1406 PARERR =1417 BADOPN =1412 NOBUFR =1407 ILFSOP =1424 DFMFD=1 DTMFD=100 BCKWRD =4000 ; EMT ASSIGNMENTS .DATE =41 .INIT =6 .RLS =7 .ALLOC =15 .RENAM =20 .APPEND =22 .PROTECT =24 .DELETE =21 .GETMAP =50 .BALLOC =47 .GETCONTIG =51 .LOOKUP =46 .CKACSP =52 .DELNK =53 .DELCONTIG =54 .SETUPFIB =52 .RLSFIB =52 .APNDP2=55 .DIRECT=14 UIC=440 DAT=432 ;FILENAME 2 EOF=40000 ; FIB ASSIGNMENTS NXTBLK =0 HOWOPEN =2 BEGEXT =4 TYPE =6 STRT =12 LENGTH =14 LAST =16 DIRITM =20 DIRBLK =22 IF =26 CBMPTR =30 FLINK =32 ; BIB ASSIGNMENTS UFDPTR =2 MYWORD =2 BLOCK =4 BUFADR =6 WC =10 STATUS =12 UNIT =13 DEVNO =13 DUNRTN =14 BUFPTR =16 BC =20 CKSUM =22 MINE2 =22 DATPTR =24 FIBLNK =26 ; DRIVER ASSIGNMENTS SBS =4 DSKTFR =10 MFDPTR =16 BMPTR =20 ; OTHER ASSIGNMENTS S.EXIT=42 S.RSAV=44 OKN ^":DP",RP11 ;BOOT FROM RP03 .WORD 0,0 ;END THE LIST RF11: MOV PC,R2 ;FIXED HEAD DISK (256KW) BR OTHER .IIF NDF,DDCDAR, .WORD 177462 .IIF DF,DDCDAR, .WORD DDCDAR-4 5 RC11: MOV PC,R2 ;FIXED HEAD DISK (64*32KW) BR OTHER RCDAR-4 ;ADRS OF WORD COUNT (COMMAND+2) 5 ;COMMAND WORD TC11: MOV PC,R2 BR TAPES 177344 ;ADRS OF WORD COUNT 5 ;LAST COMMAND 4003 ;FIRST COMMAND 100000 ;DONE MASK 24000 ;ERROR MASK TM11: MOV PC,R2 BR TM11X 172524 ;ADRS OF BYTE COUNT EN EQUAL TO IT MOV #77776,R1 ;YES - ADJUST IT TO 16K-2 BUFADJ: MOV R1,BUFSIZ ;SAVE IT MOV #MSSIZ1,R0 ;SET UP TO CREATE A DECIMAL NUMBER JSR R5,NUMOUT ;MAKE ASCII CHARACTERS OF THE NUMBER 12 ;IN BASE 10 .WRITE #CMOLB,#MSSIZ ;TELL THE USER WHAT THE SIZE OF THE BUFFER IS CLRB PARITY ;SET THE PARITY TO ODD MOVB #3,DENTRK ;SET THE DENSITY TO 800 BPI DUMP MODE MOVB #6,MODE ;ODD PARITY, AND THE DUMP MODE TO BINARY BR NEXTCM ;TAKE A COMMAND ; OUTERR: .RLSE #OUTLB ;RELEASE THE DATA SET A- DCN .TITLE EM.054 .GLOBL DCN ; EMT 51 ;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;; STACK FOR A CONTIGUOUS DISK DELETE ; BM BLOCK OR 0 ; BM BUF OR 0 ; NEW BM BUFFER ; RTN PC ; RTN STATUS ; ORIG BLOCK (DIR) ; ORIG BUFADR (DIR) ; ADR DIR ENTRY ; FIL ; NAM ; EXT ;UIC ; PCODE/MODE ; ;RTN TO MON DELCONTIG: 177400 ; FLAG FOR MON DCN: TST 6(R6) ;IS IT DECTAPE? BPL DCN00 ;NO - BRANCH JMP DTDCN ;GO TO DECTAPE DELETE DCN00: MOV @#S.RRES,R5 JSR R5,@R5 S.RRES=46 S.CDB=50 S.CDQ=52 GETBUF=54 S.RBUF=56 DKDRVR=1540 DTDRVR=4100 DKFULL =1406 PARERR =1417 BADOPN =1412 NOBUFR =1407 ILFSOP =1424 DFMFD=1 DTMFD=100 BCKWRD =4000 ; EMT ASSIGNMENTS .DATE =41 .INIT =6 .RLS =7 .ALLOC =15 .RENAM =20 .APPEND =22 .PROTECT =24 .DELETE =21 .GETMAP =50 .BALLOC =47 .GETCONTIG =51 .LOOKUP =46 .CKACSP =52 .DELNK =53 .DELCONTIG =54 .SETUPFIB =52 .RLSFIB =52 .APNDP2=55 .DIRECT=14 UIC=440 DAT=43 60003 ;LAST COMMAND 60011 ;FIRST COMMAND 200 ;DONE MASK 100000 ;ERROR MASK RK11: MOV PC,R2 ;MOVING HEAD DISK (CARTRIDGE) BR OTHER 177406 ;COMMAND WORD (5) IS THE RESET TAPES: RESET MOV R2,R0 ;GET THE ADDRESS OF THE BRANCH TST (R0)+ ;R0 TO POINT AT LAST COMMAND MOV (R0)+,R1 ;GET THE WORD COUNT ADDRESS DEC (R1) ;IF ITS MAGTAPE SET TO SKIP JUST ONE RECORD TST (R0)+ ;MOVE R0 TO FIRST COMMAND MOV (R0)+,-(R1) ;COMMAND WORD TO COMMAND REG. BIT (R0),(R1) ;LOOK FOR DND ; ASKOUT: .WRITE #CMOLB,#MSOUTE ;TELL THE USER THAT THE OUTPUT FILE IS NOT BR ASKOTT ;ACCEPATBLE, AND TRY AGAIN ; ASKODF: MOV #46600,OUTDEV ;MOVE .RAD50 "LP" TO THE OUTPUT LINK BLOCK BR ASKOIN ;AND INIT IT .SBTTL *** READ COMMAND AND PASS CONTROL ; ; LOCATION "NEXTCM" IS THE RETURN POINT FOR ALL COMMANDS ; NEXTCM: .WRITE #CMOLB,#HASHMK ;PUT OUT A MARK INDICATING THAT WE ARE READY FOR .READ #CMILB,#COMBUF ;FOR A COMMAND, READ THE COMMAND, AND .WAIT #CMILB ;WAIT FOR IT TO SHOW UP ; RESTORE REGS MOV R2,-(R6) ; PUSH ADR BM BUFFER MOV R0,R1 ; R1 POINTS TO 6(R6) ADD #6,R1 CLR @R2 ; ZERO THE LINK WORD MOV R2,(R1)+ ; SET BUFADR IN DDB MOV @R1,14(R6) ;SAVE ORIG WC MOV #-4,@R1 ;SET TO XFR TWO WORDS (RP) CMP -(R1),-(R1) ;POINTER DDB+BLOCK MOV 12(R6),R5 ; GET ADR DIR ENTRY MOV 12(R5),@R1 ; SET BLOCK = START BLK MOV 14(R5),R4 ; R4 = LENGTH BEQ DCDUN1 ;EXIT IF LENGTH = 0 DECLUP: JSR PC,DCWRIT1 ; BAM INC @R1 ; INC BLK COUNTER DEC R4 ; DEC COUNTER 2 NBLK=6 ;FILENAME - DLN .TITLE EM.053 .GLOBL DLN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; ;;;;;;;;;;;; ;;;;;;;;;;;;;; FOR DTA STACK LOOKS LIKS THIS ;;;;;;;;;;;; ;;;;;;;;;;;;;; ;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; BUF ADR FOR PBM ; BUF ADR FOR FBM ; DIR BLOCK\FBM BLOCK ; DIR IDX\FBM IDX ; ORIG BLOCK ; ORIG BUFADR ; RTN; ADR DIR ENTRY ; FIL ; NAM ; EXT ONE INDICATORS BEQ .-2 ;NONE SET, TRY AGAIN TST (R0)+ ;DONE FIRST COMMAND, CHECK FOR ERROR BIT (R0),-(R1) ;LOOK FOR SET ERROR BITS BEQ OTHER ;NO ERRORS - TRY THE READ AGAIN: JMP (R2) ;RERUN FOR ERRORS RP11: MOV PC,R2 ;MOVING HEAD DISK (PACK) BR OTHER 176716 ;COMMAND WORD (5) IS THE RESET OTHER: RESET MOV R2,R0 ;R0 TO POINT AT WORD COUNT ADRS TST (R0)+ ;POINT TO ADDRESS MOV (R0)+,R1 ;WORD COUNT ADRS TO R1 MOV #-1000,(R1) ;LOAD WORD COUNT MOV (R0),-(R1) ;COMMAND TO COJSR R5,ECHO ;ECHO THE COMMAND .WORD COMBUF ;IF NEEDED JSR R5,SETGET ;SET UP TO PICK CHARACTERS FROM THE .WORD COMBUF ;COMMAND BUFFER BR ILLCCC ;IF TROUBLE, IT MEANS AN ILLEGAL COMMAND ; MOV #CMDIN,R0 ;GET READY TO PICK OUT THE COMMAND JSR PC,GETCNS ;GET THE NEXT CHARACTER THAT IS NOT A SPACE BR COMGOV ;AND START WORKING WITH IT COMGET: JSR PC,GETC ;PICK UP THE NEXT CHARACTER CMP R5,#40 ;IS IT A SPACE? BEQ COMGOT ;YES, WE HAVE A COMMAND COMGOV: CMP R5,#12 ;IS IT A TERMINATOR? BNE DECLUP ; LOOP IF NOT DONE DCZBM: MOV -2(R0),R4 MOV MFDPTR(R4),(R1)+ MOV 14(R6),WC(R0) JSR PC,DCREAD1 ;READ 1ST MFD BLOCK MOV #177700,WC(R0) ;SET FOR 64 WORD XFRS MOVB UNIT(R0),R5 BIC #177770,R5 ASL R5 ADD #BMPTR,R5 ;POINTER PROPER FIB CHAIN ADD R4,R5 MOV @R5,R5 ;IS A BIT MAP IN CORE? BNE DCBMIN ;YES - BRANCH CLR -(R6) CLR -(R6) ;INDICATE NO BIT MAP TST -(R1) ;POINTER DDB+BLOCK BR DCZGO DCBMIN: MOV -(R5),R5 ;GET BIT MAP BUF ADDR MOV R5,-(R6) ;SAVE IT MOV R5, ; UIC ; PCODE MODE ; RTN TO MON DELNK: 177400 DLN: MOV @#S.RRES,-(R6) JSR R5,@(R6)+ MOV -2(BIBREG),R1 ;READ MFD #1 MOV R0,R4 ;GET A FLOATING DDB POINTER CMP (R4)+,(R4)+ MOV MFDPTR(R1),(R4)+ MOV R2,(R4)+ MOV @R4,-(R6) ;SAVE OLD WORD COUNT MOV R2,-(R6) ;PUSH R2 BUFFER ADD #256.,R2 ;GET A "SECOND" BUFFER MOV #-128.,@R4 ;USE MAX MFD#1 SIZE JSR PC,DREAD1 MOV #-64.,@R4 ;NOW SET FOR 64 WORD XFRS ;IF A BIT MAP IS IN CORE ;WRITE IT AND PUT MOVB UNIT(R0),R5 BIMMAND REGISTER BIT #100200,(R1) ;CHECK FOR ERROR OR DONE BEQ .-4 ;IF NEITHER, KEEP LOOKING BMI AGAIN ;ERROR, TRY AGAIN CLR PC TM11X: RESET BIT #MTBOT,@#MTAS BNE TAPES MOV #MTREW,@#MTAC TM11Y: BIT #MTTUR,@#MTAS BEQ TM11Y BR TAPES TOKFI: INC MTFIND ;SET FLAG TO FORCE SEARCH FOR FILE ;ALSO FORCE REWIND FIRST... TOKRE: INC MTRWD ;INDICATE REWIND IS TO BE PERFORMED BR TOKN1 ;AND GO BACK TOKNOL: MOV #-1,LABEL ;SET LABEL SWITCH TO -1 TOKN1: JMP TOKDF2 ;AND SKIP TO NEXT BEQ COMGOT ;YES - WE HAVE A CMD MOVB R5,(R0)+ ;NO - PUT THE CHARACTER IN THE CMD BUFFER BR COMGET ;AND GET ANOTHER CHARACTER COMGOT: CMP R0,#CMDIN ;HAVE WE PICKED UP ANY CHARACTERS? BEQ NEXTCM ;NO - GO BACK AND GET ANOTHER COMMAND MOVB #'$,(R0)+ ;COMMAND IS IN, FOLLOW IT WITH A "$" ; MOV #CMNDS,R0 ;SET UP TO SCAN THE COMMANDS CLR R1 ;R1 WILL BE THE INDEX INTO THE TABLE COMDEC: MOV #CMDIN,R2 ;SET UP POINTING TO THE COMMAND READ COMCOM: CMPB (R2),(R0) ;DO THE CHARACTERS MATCH? BNE CO@R1 ;PUT IN DDB MOV 2(R5),R4 ADD 6(R5),R4 DEC R4 ;GET BIT MAP BLOCK MOV R4,-(R6) ;SAVE IT MOV R4,-(R1) ;PUT IN DDB JSR PC,DCWRIT1 ;WRITE THE MAP ; COMPUTE THE MAP NUMBER CORRESPONDING TO THE ; STARTING BLOCK OF THE FILE DCZGO: MOV 16(R6),R4 ; GET FILE DIR ADR MOV 12(R4),-(R6) ; PUSH START BLK ; MOV R2,R3 ADD #6,R3 ;R3 NOW POINTS TO BLOCK ;ADR OF FIRST MAP CMP @R6,#960. BLO DCZG1 SUB #960.,@R6 TST (R3)+ BR .-14 DCZG1: MOV @R3,(R1)+ MOV R2,@R1 JSR PCC #177770,R5 ASL R5 ADD #BMPTR,R5 ADD R1,R5 ;POINTER PROPER FIB CHAIN MOV @R5,R5 ;IS A BIT MAP IN CORE? BNE DLN00 ;YES - BRANCH CLR -(R6) CLR -(R6) ;INDICATE NO MAP CMP -(R4),-(R4) ;POINTER DDB+BLOCK BR DEL1 DLN00: MOV -(R5),R5 ;GET BIT MAP BUF ADDR MOV R5,-(R6) ;SAVE IT MOV R5,-(R4) ;PUT IN DDB MOV 2(R5),R3 ADD 6(R5),R3 DEC R3 ;GET BIT MAP BLOCK MOV R3,-(R6) ;SAVE IT MOV R3,-(R4) ;PUT IN DDB JSR PC,DWRIT1 ;WRITE THE BIT MAP ;START SETTING UP DEL1: MOV #1,-(R TOKEN TOKHLP: JSR R5,MES ;GIVE HIM THE SPIEL + HELPER ;SO HE KNOWS WHAT TO DO JMP COMCON ;AND START ALL OVER AGAIN TOKDP: MOV #2,R2 ;FLAG IT AS AN RP11 DISK MOV #RPTRKS,TRACKS ;SET UP DISK SIZE BR TOKDK0 ;REST IS COMMON WITH RK TOKDK: MOV #1,R2 ;FLAG IT AS AN RK11 DISK MOV #RKSIZE/4,TRACKS;SET UP DISK SIZE TOKDK0: CMPB (R0),#': ;SEE IF DK: WAS SPECIFIED BNE 1$ ;NO SO GO ON MOVB #'0,-(R0) ;FORCE DK0: FOR DK: 1$: CMPB (R0),#'0 ;NEXT CHAR MUST BE UNIT NUMBER BLO GTOERR MNOT ;NO - MATCH HAS ENDED CMPB #'$,(R0)+ ;END OF COMMAND IN THE TABLE? BEQ COMENC ;YES CMPB #'$,(R2)+ ;END OF COMMAND READ? BNE COMCOM ;NO - CONTINUE SCAN COMGCM: CMPB (R0)+,#'$ ;YES - NO MATCH HERE (THE "$" WOULD MATCH) BNE COMGCM ;SO WE SCAN TO THE END OF THIS TABLE ENTRY COMGCC: CMPB (R0),#'$ ;IS THIS THE END OF THE TABLE? BEQ ILLCCC ;YES - ILLEGAL COMMAND INC R1 ;NO - UP THE INDEX POINTER BR COMDEC ;AND CONTINUE THE SCAN COMNOT: CMP R2,#CMDIN+2 ;DID THE FIRST TWO CHARACTERS ,DCREAD1 ;READ MAP ;@R6=WORD MOV @R6,R4 ;CONVERT BLOCK TO A BIT BIC #177760,R4 MOV #1,R5 DEC R4 BMI .+6 ASL R5 BR .-6 MOV (R6)+,R4 ASR R4 ASR R4 ASR R4 ;COMPUTE STARTING WORD ASR R4 ;WITHIN THE MAP ASL R4 ADD #10,R4 ADD @R1,R4 ;R5=MASK ADD #200,R2 ;R2=HI WORD THIS MAP MOV 16(R6),R1 ;R1=LENGTH MOV 14(R1),R1 BEQ DCZDUN ; LOOP HERE,CLEARING THE BITS IN THE MAP DCZLUP: BIC R5,@R4 ;CLEAR A BIT DEC R1 ;DEC COUNTER BEQ DCZDONE ;DONE? ASL R6) ;CURRENT BM # EQ 1 MOV R2,-(R6) ; PUSH ADR MAP BUFFER. ; NOTE THAT THIS IS THE OTHER HALF ; OF THE BUFFER GOTTEN AT THE EMT CALL BR DEL1A .WORD 0,0,0,0,0,0,0 .WORD 0 ;SAFETY VALVE FOR RP02 DEL1A: MOV PC,-(R6) ;GET BUFFER ADDRESS FOR ADD #DLN-.,@R6 ;BLOCK LIST -***- MOV 12(R6),R3 ;READ MAP 1 MOV 6(R3),@R4 ; R3 IS ADR OF THE MAP MOV (R4)+,-(R6) ;PUSH FIRST BLOCK NUMBER ; USE IT LATER AS CUR BLK NUM MOV R2,@R4 JSR PC,DREAD1 ;READ MAP #1 MOV 30(R6),R2 ; GET ADR ;IF NOT COMPLAIN CMPB (R0),#'7 BHI GTOERR RORB (R0) ;PUT UNIT# IN HIGH 3 BITS RORB (R0) RORB (R0) RORB (R0) BICB #37,(R0) ;LEAVE ONLY UNIT BITS BIT #RHS,FLAGS ;INPUT OR OUTPUT UNIT? BEQ TOKDK1 ;RIGHT HAND SIDE MOVB (R0)+,RKIN+1 ;SAVE INPUT UNIT BIT #DFL,FLAGS ;DISK OUTPUT TOO ? BEQ TOKDK2 ;NO PROBLEM IF NOT CMP R2,DSKDAE ;SAME TYPE ? BNE GTOERR ;ERROR IF NOT CMPB RKIN+1,RKOUT+1 ;IN AND OUT UNITS SAME ? BEQ GTOERR ;YES, WE CAN'T DO THAT BR TOKDK2 TOKDK1: MOVB (R0)+,MATCH? BNE COMGCM ;NO - GO TO THE NEXT COMMAND CMPB (R2),#'$ ;IS THIS THE END OF THE COMMAND READ? BNE COMGCM ;NO - NO MATCH BR COMDCS ;YES - ABBREV. COMMAND DECODED COMENC: CMPB (R2)+,#'$ ;IS THIS THE END OF THE COMMAND READ ALSO? BNE COMGCC ;NO - NO MATCH ON THIS COMMAND - CHECK FOR END COMDCS: ASL R1 ;YES - WE HAVE FOUND A MATCH JMP @COMTAB(R1) ;BRANCH TO THE APPROPRIATE ROUTINE TO HANDLE IT ; ; ILLCCC: BITB COMBUF+3,#100 ;WAS THIS THE END OF THE FILE ON THE INPUT? BNE EXITIT ;5 BNE DCZLUP ;STAY IN LOOP UNTIL ;THIS WORD DONE TST (R4)+ ;STEP TO NEXT WORD DCZL2: CMP R4,R2 ;PAST THE END OF THE BIT MAP? BLO DCZL3 ;NO - BRANCH JSR PC,DCWRIT1 ;WRITE THIS MAP MOV @BUFADR(R0),BLOCK(R0) ;AND READ NEXT JSR PC,DCREAD1 ;(THERE MUST BE ONE) MOV BUFADR(R0),R4 ADD #10,R4 ;INITIALIZE MAP POINTER DCZL3: SUB #20,R1 ;16. OR MOR BLOCKS LEFT? BCS DCZL4 ;NO - BRANCH CLR (R4)+ ;CLEAR BITS BR DCZL2 ;GO AGAIN DCZL4: MOV #1,R5 ;RESET BIT MASK WORD ADD #20,R1 DIR ENTRY MOV 12(R2),-(R6) ; START BLOCK ; -***- FROM DLN: TO HERE IS "ONCE THROUGH" CODE. ; -***- THE BLOCK LIST IS READ INTO THIS AREA. DEL2: MOV #NBLK-1,R1 ;SET BLOCK COUNTER MOV #-4,WC(R0) ;SET FOR ONE WORD READS MOV 4(R6),R2 ;GET THE BUFFER POINTER MOV @R6,@R2 ;PICK UP THE LEAD BLOCK DEL2A: MOV (R2)+,BLOCK(R0) ;SET TO READ THE LINK BEQ DEL2C ;BRANCH IF NONE MOV R2,BUFADR(R0) DEL2B: JSR PC,DREAD1 DEC R1 ;MORE TO GO? BGT DEL2A ;YES - BRANCH BLT DEL2B1 ;BRANCH IF NXT LRKOUT+1 ;SAVE OUTPUT UNIT TOKDK2: MOV R2,DSKDAE ;SET DISK TYPE JMP TOKDF0 ;HANDLE OTHERWISE AS ORDINARY DISK TOKFO: BIT #RHS,FLAGS ;FORMAT SWITCH MUST BE ON LHS BEQ 2$ ;IT IS 1$: JMP COMERR ;ELSE ERROR 2$: BIT #DFL,FLAGS ;MUST HAVE DISK ON LEFT BEQ 1$ ;ELSE ERROR TST DSKDAE ;ALSO MUST BE RK OR RP BLE 1$ ;YOU GUESSED IT MOV #-1,PFMT ;SET FORMAT SWITCH ON JSR R5,SKIPPE ;FORGET REST OF SWITCH + 0 ; JMP GTOK ;GET < AND RHS ;ROUTINE TO SKIP OVER REST OF CURRENT TOKEN ;CALL JSRYES - EXIT .WRITE #CMOLB,#ILCOMM ;NO - WRITE OUT AN ILLEGAL COMMAND MESSAGE JSR R5,ECHO ;ECHO THE MESSAGE IF .WORD ILCOMM ;IT IS NEEDED BR NEXTCM ;AND GET ANOTHER COMMAND ILLCOM: .WRITE #CMOLB,#ILLSYM ;THIS IS REALLY ILLEGAL SYNTAX ERR MSG JSR R5,ECHO .WORD ILLSYM BR NEXTCM ;GO TRY AGAIN EXITIT: .CLOSE #CMILB ;CLOSE ALL DATA SETS .CLOSE #CMOLB .CLOSE #OUTLB .RLSE #CMILB ;AND RELEASE ALL DATA SETS .RLSE #CMOLB .RLSE #OUTLB .RLSE #MTLB ; .EXIT ;ALL DONE - EXIT ; ; ;;FIX BLOCK COUNT BNE DCZLUP ;CONTINUE DCZDONE: JSR PC,DCWRIT1 DCZDUN: MOV (R6)+,BLOCK(BIBREG) ;READ BM IF IT WAS IN CORE MOV (R6)+,BUFADR(BIBREG) BEQ DCDUN1 JSR PC,DCREAD1 DCDUN1: MOV 14(R6),WC(R0) ; RESTORE ORIG WC DCDUNX: MOV #20,-(R6) MOV @#S.RBUF,R5 JSR R5,@R5 DCDUN2: MOV @#S.RSAV,R5 JSR R5,@R5 ; SET UP STACK FOR EXIT THRU MON DCDUN3: MOV @#S.EXIT,R5 TSTB DELCONTIG BNE .+4 CMP (R5)+,(R5)+ MOV R5,PC ; GO BABY DTDCN: MOV 2(R6),R0 CMP (R0)+,(R0)+ MOV (R0)+,R1 ;EAD BLK OBTAINED MOV (R2)+,BLOCK(R0) ;GET NEXT LEAD BLOCK MOV R2,BUFADR(R0) BR DEL2B DEL2B1: MOV @R2,@R6 DEL2C: CLR -(R6) MOV R6,BUFADR(R0) MOV #NBLK,R1 ;SET COUNT MOV 6(R6),R2 ;GET BLOCK LIST DEL2D: MOV (R2)+,BLOCK(R0) ;SET TO CLEAR NEXT LINK BEQ DEL2E ;BRANCH IF NO MORE JSR PC,DWRIT1 ;WRITE THE LINK WORD DEC R1 ;DONE WITH LIST YET? BNE DEL2D ;NO - BRANCH DEL2E: TST (R6)+ ;POP OFF THE "0" BUFFER MOV #NBLK,R1 ;SET COUNTER MOV 4(R6),R2 ;GET BLOCK LIST POINTER DEL2F: MOV R5,SKIPPER ; + BITS ;STOP ON GIVEN CHARS ;IF EOL IS DETECTED, AND NOT A STOPPING CHAR, THEN COMPLAIN! ;BITS TESTED INCLUDE COL =100000 ;STOP ON COLON COM =200 ;STOP ON COMMA EOL =1 ;STOP ON END OF LINE SKIPPE: CMPB (R0),#15 ;IS THIS AN EOL? BEQ SKIP01 ;YES--SEE IF EXPECTED CMPB (R0),#': ;IS IT A : BEQ SKIP02 ;YES CMPB (R0),#', ;COMMA? BEQ SKIP03 ;YES CMPB (R0),#40 ;SKIP SPACES, ALPHAS, AND NUMERICS BEQ SKIP04 ;SPACES CMPB (R0),#'0 ;NUMBER? BLT SKIP05 ;NO--STOP ON W ; ; COMMAND TABLE: ; ; THIS TABLE LISTS ALL OF THE LEGAL COMMANDS, IN THE SAME ORDER AS THE ; TABLE OF ADDRESSES THAT FOLLOWS. THE RULE FOR ABBREVIATING A COMMAND TO TWO ; CHARACTERS IS THAT THE FIRST COMMAND IN THE TABLE THAT BEGINS WITH THE ; TWO CHARACTERS IS THE ONE THAT MAY BE ABBREVIATED. IF ANOTHER COMMAND THAT ; BEGINS WITH THE SAME TWO CHARACTERS IS PRESENT, IT MUST FOLLOW THE COMMAND ; IN THE TABLE. THERE IS NO SPECIAL ORDER TO THE TABLE OTHER THAN THIS. ; ; ALL ENTRIES IN THE TABLE STARTING BLOCK IN R1 MOV @R0,R0 ;LENGTH IN R0 BEQ DCDUN3 MOV R1,R3 BIC #177760,R3 MOV #1,R4 DTDC00: DEC R3 BMI DTDC05 ;CONVERT BLOCK TO BIT ASL R4 BR DTDC00 DTDC05: ASR R1 ASR R1 ASR R1 ASR R1 ASL R1 ADD #10,R1 ;R1 POINTS TO FIRST BIT MAP ADD 4(R6),R1 ;TO BE ALTERED DTDC10: BIC R4,@R1 DEC R0 BEQ DCDUN3 ASL R4 BNE DTDC10 ;CLEAR BITS IN DT PBM TST (R1)+ DTDC15: SUB #20,R0 BCS DTDC20 CLR (R1)+ BR DTDC15 DTDC20: ADD #20,R0 BEQ DCDUN3 MOV #1,R4 BR DTD@R2,-(R6) ;GET NEXT BLOCK BEQ DELXIT ;EXIT IF NO MORE MOV #1,R3 DEL3A: CMP @R6,#960. BLO DEL3B SUB #960.,@R6 INC R3 BR DEL3A DEL3B: CMP R3,12(R6) BEQ DEL7 ;YES ;NO - IT DOESNT SO MOV R0,R4 ;GET FLOATING DDB POINTER CMP (R4)+,(R4)+ MOV 4(R6),(R4)+ ;WRITE THE CURRENT MAP MOV 10(R6),(R4)+ MOV #-64.,@R4 ;SET WORD COUNT TO 64. JSR PC,DWRIT1 DEL4: MOV R3,12(R6) ;DETERMINE THE PROPER MAP # MOV 20(R6),R5 CMP (R5)+,(R5)+ TST (R5)+ DEC R3 BNE .-4 MOV @R5,4(R6) MOEIRDO CMPB (R0),#'9 ;IN NUMERIC RANGE? BLE SKIP04 ;YES--SKIP IT CMPB (R0),#'A ;ALPHA? BLT SKIP05 ;STOP ON WEIRDO CMPB (R0),#'Z ;IN ALPHA RANGE? BGT SKIP05 ;NO WEIRDO-- SKIP04: INC R0 ;SKIP CHAR & TRY NEXT BR SKIPPE ;UNTIL END COND. IS DETEC. SKIP01: BIT #EOL,(R5) ;END EXPECTED BNE SKIP05 ;YES-RETRUN TO CALLER GTOERR: JMP COMERR ;NO--COMPLAIN SKIP02: TST (R5) ;":" SEEN--SHOULD WE STOP SKIP06: BEQ SKIP04 ;NO--KEEP GOING SKIP05: TST (R5)+ ;SKIP ARG IN CALL RTS R5 ;AND RARE SEPERATED BY THE CHARACTER "$", AND THE ; LAST ENTRY IS SHOWN BY A NULL COMMAND (I.E., TWO "$" CHARACTERS IN A ROW.) ; CMNDS: .ASCII 'MODE$TRACK$DENSITY$PARITY$DUMP$BACKSPACE$FORWARDSPACE$' .ASCII 'SKIPFILE$BACKFILE$NEWDIR$DIRECTORY$FIND$WEOF$' .ASCII 'REWIND$RUN$EXIT$FFIND$TO$FROM$ECHO$$' .EVEN ; ; ; TRANSFER TABLE: ; ; THE FOLLOWING IS A LIST OF ADDRESSES OF THE ROUTINES THAT WILL HANDLE ; THE VARIOUS COMMANDS. IT IS IN THE SAME ORDER AS THE COMMAND TABLE. ; ; THE EXIT FROM THE ROUTC10 ;THE ABOVE DUPLICATES A LOT OF CODE FOR DISK ;CONTIG DELETE. IF YOU EVER NEED MORE SPACE, ;MAKE A SUBROUTINE OUT OF IT ;FILE STRUCTURES READ/WRITE SUBROUTINE DCWRIT1: MOV #OUT,R5 ;SET FOR WRITE BR .+6 DCREAD1: MOV #IN,R5 ;SET FOR READ MOV @#S.RSAV,-(R6) JSR R5,@(R6)+ ;SAVE REGISTERS MOV R0,-(R6) ;SAVE DDB ADDRESS MOV R6,R2 ;AND POINTER THERETO MOV @R0,-(R6) ;SAVE DDB CONTENT MOV R2,-(R6) ;FOR WAIT BELOW MOV #10,R1 ;FOR DRIVER CALL MOV R0,R3 ADD #12,R3 BIC #6V 10(R6),-(R4) MOV @R5,-(R4) JSR PC,DREAD1 ; READ THE PROPER MAP ;THE CURRENT MAP REPRESENTS THIS BLOCK ;CLEAR THE BIT ;REGISTER STATUS IS ;R0=BIB ;R1=L INT. ;@R6=CLEAR BLOCK # DEL7: MOV (R2)+,R4 ;CONVERT BLOCK # TO A WORD BIC #177760,R4 MOV #1,R5 ;R5=MASK DEC R4 BMI .+6 ASL R5 BR .-6 MOV (R6)+,R4 ASR R4 ASR R4 ASR R4 BIC #1,R4 ; MAKE R4 EVEN ADD #10,R4 ADD 6(R6),R4 BIC R5,@R4 ;CLEAR IT DEC R1 ;DONE WITH LIST YET? BNE DEL2F ;NO ETURN SKIP03: TSTB (R5) ;COMMA SEEN--SHOULD WE STOP? BR SKIP06 ;WILL TELL ;ROLL OUT DRIVERS DFIN: MOV ILB,DFPAR ;INPUT FROM DISK MOV ILB+2,DFPAR+2 ; MOV #RFUN,DFPAR+10 ;DISK FUNCTION IS READ MOV ILBEND,R0 ;END BLOCK FOR COMPUTATION MOV ILBEND+2,R1 ; MOV RKIN,-(SP) ;SAVE INPUT RKUNIT BR DF01 ;REST IS COMMON FOR READ/WRITE DFOUT: MOV OLB,DFPAR ;FIRST LOGICAL BLOCK TO OUTPUT MOV OLB+2,DFPAR+2 ; MOV #WFUN,DFPAR+10 ;FUNCTION IS WRITE MOV OLBEND,R0 ;SAVE END BLOCK HERE TOO MOINE IS VIA A JUMP OR BRANCH TO LOCATION "NEXTCM" ; COMTAB: .WORD MOD00,TRA00,DEN00,PAR00,DUM00,BAC00,FOR00 .WORD SKI00,BAF00,NEW00,DIR00,FIN00,WEO00 .WORD REW00,RUN00,EXITIT,FFI00,TO00,FRO00,ECH00 ; ; .SBTTL *** "ECHO" AND ECHOING ; ECHO: MOV (R5)+,-(SP) ;MOVE THE ADDRESS ON THE STACK TST ECHOSW ;ECHO ON? BMI ECHOFF ;NO - DONE MOV #OUTLB,-(SP) ;YES - DO A WRITE .WAIT #CMOLB ;MAKE CERTAIN THAT THE NORMAL IS DONE EMT 2 ; .WAIT #OUTLB ;AND WAIT FOR IT TO COMPLETE RTS R5 ;AND ,@R3 BIS 20(R6),(R3)+ ;ENTER FUNCTION IN DDB MOV PC,@R3 ;SET UP COMPLETION RETURN ADD #RETN-.,@R3 MOV @#S.CDB,-(R6) ;CALL DRIVER JSR PC,@(R6)+ EMT 1 ;WAIT FOR COMPLETION MOV (R6)+,@(R6)+ ;RESTORE (DDB)-DESTROYED AT RETN MOV @#S.RRES,-(R6) JSR R5,@(R6)+ ;RESTORE REGISTERS RTS PC RETN: MOV @R0,-(R6) ;DRIVER COMPLETION COMES HERE MOV #PARERR,-(R6) ;SET UP FOR PARITY ERROR TST STATUS(R0) ;IF THERE IS ONE, GO TO BMI DCREAD1+2 ;#IN=4=IOT TST (R6)+ MOV @#S.EXIT,R5 ;USE SAM RTN T- BRANCH BR DEL2 DELXIT: CMP (R6)+,(R6)+ ;POP THE 0 AND THE LAST LEAD BLOCK MOV R0,R4 ;GET FLOATING DDB POINTER CMP (R4)+,(R4)+ MOV (R6)+,(R4)+ ; GET BLK NUM CUR BIT MAP TST (R6)+ ; SKIP OVER TOP ELEMENT MOV (R6)+,(R4)+ ; SET BUFADR IN DDB MOV #-64.,@R4 ;SET WORD COUNT TO 64. JSR PC,DWRIT1 ; WRITE IT TST (R6)+ ; SKIP OVER TOP ELEMENT CMP -(R4),-(R4) ;SET R4 TO DDB+BLOCK MOV (R6)+,(R4)+ ; IF A BIT MAP WAS ORIG IN MOV (R6)+,(R4)+ ; CORE, THEN READ IT BACK BEQ DELX1 JSR PCV OLBEND+2,R1 ; MOV RKOUT,-(SP) ;SAVE OUTPUT RKUNIT TST VERIFY ;IS THIS THE VERIFY PASS? BLE DF01 ;NO...GO ON ;SPECIAL VERIFY PASS DISK CODE MOV #RFUN,DFPAR+10 ;DO A READ INSTEAD OF A WRITE MOV BUFSIZ,R2 ;COMPUTE BUF2 ADDRESS SWAB R2 ;AS BUF+(BUFSIZ*512.) ASL R2 ADD R2,DFPAR+4 ;ADD TO BUF ADDRESS MOV (SP),-(SP) ;DO SOME STACK DIDDLING MOV #DFCHK1,2(SP) ;TO FORCE RTS TO GO TO DFCHK1! BR DF02 ;AND CONTINUE DF01: MOV #BUF,DFPAR+4 ;CORE ADDRESS DF02: JSR R5,ROOM ;COMPUTE NUMBELEAVE ECHOFF: TST (SP)+ ;POP THE STACK RTS R5 ;AND GO BACK ; ECHOSW: .WORD 0 ;ECHO ON INITIALLY ; ; ; ; ECH00: JSR PC,GETCNS ;GET THE NEXT NON-SPACE CHARACTER CMP R5,#'O ;ON OR OFF? BNE MOD999 ;NO - ILLEGAL JSR PC,GETC ;GET THE NEXT CHAR CMP R5,#'N ;ON? BEQ ECH10 ;YES CMP R5,#'F ;OFF? BNE MOD999 ;NO - ERROR JSR PC,GETC ;GO GET AN F CMP R5,#'F ;IS IT? BNE MOD999 ;NO -ERR JSR PC,GETC JSR PC,DEN80 ;MAKE CERTAIN THAT ALL IS WELL MOV #-1,ECHOSW ;SET UP THE ECHO O DEQUEUE DRVR JMP -12(R5) ;CLEARS DDB, SO RESTORE ABOVE CAT =.-DELCONTIG .END ; END OF DCN + EMT 1 ;WAIT FOR COMPLETION ,DREAD1 DELX1: MOV #20,-(R6) ; RELEASE THE BUF MOV @#S.RBUF,R5 JSR R5,@R5 MOV (R6)+,@R4 ;RESTORE ORIGINAL WORD COUNT MOV @#S.RSAV,R5 JSR R5,@R5 ; SET UP STACK FOR EXIT THRU MON MOV @#S.EXIT,R5 TSTB DELNK BNE .+4 CMP (R5)+,(R5)+ MOV R5,PC ; GO BABY ;STACK LOOKS LIKE THIS FOR ;DELETION OF LINKED FILES ; CUR BLOCK 0 ; CUR BM BLOCK 2 ; BUFADR FILE 4 ; BUFADR MAP 6 ; CURRENT BM# 10 ; HIS PBM BLOCK# 12 ; HIS PBM BUFADR 14 ; BUFADR MFD #1 16 ; DR OF SECTORS TO READ + DFPAR ;CURRENT SECTOR NUMBER + DFPAR+6 ;SECTOR COUNT FOR TRANSFER MOV #5,DFPAR+12 ;ERROR COUNT = 5 JSR PC,DFGO ;DO IT TST (SP)+ ;FLUSH UNIT NUMBER OFF STACK RTS PC ;AND RETURN ;WE GET HERE FROM THE RTS PC!! DFCHK1: MOV DFPAR+6,R4 ;GET NUMBER OR SECTORS READ SWAB R4 ;AND CONVERTS TO BYTES ASL R4 JMP CHECK ;DO VERIFY AND FALL OUT TO EXIT DFGO: MOV #DFPAR,R4 ;POINTER TO DFPAR DFGO1: MOV (R4)+,-(SP) ;SECTOR # (LOW ORDER BITS) MOV (R4)+,-(SP) ;AND THE HISWITCH BR TRA998 ;ALL DONE ECH10: JSR PC,GETC JSR PC,DEN80 ;CLEAN UP THE SYNTAX CLR ECHOSW ;SET THE SWITCH JSR R5,ECHO ;ECHO THE COMMAND .WORD COMBUF BR TRA998 ;ALL DONE .SBTTL *** "RUN" AND "MODE" ; RUN00: JSR PC,GETUNT ;GO GET A UNIT NUMBER JSR PC,DEN80 ;CHECK TO END OF LINE FOR NOTHING ELSE MOVB R0,RUNUNT ;SET THE NEW UNIT NUMBER IN JSR PC,RUN01 ;RELEASE AND INIT THE NEW ONE BR TRA998 ;AND TAKE ANOTHER COMMAND RUN01: .RLSE #MTLB ;RELEASE THIS UNIT .INIT #MTLB ;AND IN .TITLE RFBOOT ; ; ; RF BOOTSTRAP CONDITIONALIZED TO BE THE DDC BOOTSTRAP FOR THE SECOND ; DDC DISC ; ; TO OBTAIN THE DDC DISC VERSION, DEFINE 'DDCDAR' AS THE BUS ADDRESS OF ; THE DISC ADDRESS REGISTER (DAR) IN THE DDC CONTROLLER. ; ; FOR THE NORMAL DEC RF11 VERSION, DON'T DEFINE ANYTHING, JUST ASSEMBLE. ; R0=%0 R1=%1 R2=%2 R3=%3 ;HARDWARE REGISTERS R4=%4 ;R5 ;SP PC=%7 ; CLEAR=400 ;DISK CONTROL CLEAR COMMAND READ=5 ;READ COMMAND ; .GLOBL RFSTRT ; RFSTRT: START: MOV #INIT-STARTIR BLOCK 20 ; DIR BUFADR ; ADR DIR ENTRY ; FIL ; NAM ; EXT ; UIC ; P/MODE ; RTN ADR ;FILE STRUCTURES READ/WRITE SUBROUTINE DWRIT1: MOV #OUT,R5 ;SET FOR WRITE BR .+6 DREAD1: MOV #IN,R5 ;SET FOR READ MOV @#S.RSAV,-(R6) JSR R5,@(R6)+ ;SAVE REGISTERS MOV R0,-(R6) ;SAVE DDB ADDRESS MOV R6,R2 ;AND POINTER THERETO MOV @R0,-(R6) ;SAVE DDB CONTENT MOV R2,-(R6) ;FOR WAIT BELOW MOV #10,R1 ;FOR DRIVER CALL MOV R0,R3 ADD #12,R3 BIC #6,@R3 BIS 20(R6),(R3)+ ;ENTER FUNCTI GH ORDER BITS BNE DFGO7 ;IF NOT SECTOR 0,DON'T CHECK FLAG TST 2(SP) ;BOTH WORDS = 0 FOR SECTOR 0 BEQ DFGO6 ;IF SECTOR 0,CHECK FORMAT AND V4A FLAG DFGO7: MOV DSKDAE,R1 ;GET POINTER TO EXTENDED ADDRESS IN R1 BEQ DFISDC ;CHECK FOR AN RC11 DISK BGT DFISDK ;CHECK FOR RK11 DISK .IF NDF,DDCDAR MOV #RFCLR,@#RFSTS ;CLEAR OUT THE RF11 TST (SP)+ ;POP EXTENDED SEGMENT NUMBER SWAB (SP) ;TIMES 256. CLR (R1) ;CLEAR EXTENDED ADDR MOVB (SP),(R1) ;AND SET IT CLRB (SP) ;CLEAR IT ON STACK IT A NEW ONE TO IT RTS PC ;LEAVE ; ; MOD00: JSR PC,GETCNS ;GET THE NEXT CHARACTER THAT IS NOT A SPACE CMP R5,#'A ;POSSIBLE ASCII? BEQ MOD01 ;YES CMP R5,#'B ;POSSIBLE BYTE OR BINARY? BEQ MOD10 ;YES CMP R5,#'R ;POSSIBLE RAD50? BNE MOD999 ;NO - ILLEGAL COMMAND MOV #MOD50,R0 ;SET UP THE PROPER LIST BR MOD20 ;AND CHECK IT OUT MOD01: MOV #MOD51,R0 ;SET UP THE PROPER LIST FOR THIS ONE BR MOD20 ;AND CHECK IT OUT MOD10: JSR PC,GETC ;GET THE NEXT CHARACTER CMP R5,#'I ;IS IT POS ,R0 ;GET START OF CODE TO MOVE MOV BEGIN,R1 ;GET START OF DESTINATION MOV R1,R4 ;SAVE FOR TRANSFER MOVE: MOV (R0)+,(R1)+ ;MOVE CODE TO HIGH CORE CMP R0,#END-START ;CHECK FOR END OF MOVE BNE MOVE ;LOOP UNTIL END OF CODE MOV R4,PC ;THEN TRANSFER TO BOOT INIT: SUB #20,R1 ;POINTER TO PARAMETERS MOV #READ,R2 ;DO A 'READ' INIT00: RESET ;CLEAR THE BUS MOV PC,R4 ;SAVE START ADDRESS BOOT: MOV EXTRPG,R0 ;GET EXTERNAL PAGE ADDRESS MOV #CLEAR,(R0) ;CLEAR OUT RF CONTROL ADD #10,R0 ;ADD ON IN DDB MOV PC,@R3 ;SET UP COMPLETION RETURN ADD #RETN-.,@R3 MOV @#S.CDB,-(R6) ;CALL DRIVER JSR PC,@(R6)+ EMT 1 ;WAIT FOR COMPLETION MOV (R6)+,@(R6)+ ;RESTORE (DDB)-DESTROYED AT RETN MOV @#S.RRES,-(R6) JSR R5,@(R6)+ ;RESTORE REGISTERS RTS PC RETN: MOV @R0,-(R6) ;DRIVER COMPLETION COMES HERE MOV #PARERR,-(R6) ;SET UP FOR PARITY ERROR TST STATUS(R0) ;IF THERE IS ONE, GO TO BMI DREAD1+2 ;#IN=4=IOT TST (R6)+ MOV @#S.EXIT,R5 ;USE SAM RTN TO DEQUEUE DRVR JMP -12(R5) ;CLEARS .IFF TST (SP)+ ;POP EXTENDED ADDR MOV #DDCDAR+2,R1 ;AND SET UP TO FILL THE REGISTERS MOV #400,@#DDCDAR-6 ;CLEAR THE CONTROL ASL (SP) ;MULTIPLY THE BLOCK NUMBER BY 4 ASL (SP) ;TO ALLOW FOR 256. WORD BLOCKS .ENDC DFGO5: MOV (SP),-(R1) ;SET LOW ORDER ADDRE MOV (SP)+,@#177570 ;SHOW IT IN THE SWITCH REGISTER DFGO4: MOV (R4)+,-(R1) ;AND CORE ADDRESS MOV (R4)+,-(R1) ;AND POSITIVE SECTOR COUNT SWAB (R1) ;NOW ITS A WORD COUNT NEG (R1) ;AND A NEGATIVE WORD COUNT MOV (R4)+,-(R1) ;LOAD FUSIBLY BINARY? BEQ MOD11 ;YES CMP R5,#'Y ;POSSIBLE BYTE? BNE MOD999 ;NO - ILLEGAL COMMAND MOV #MOD52,R0 ;SET UP THE LIST BR MOD20 ;AND CHECK IT MOD11: MOV #MOD53,R0 ;SET UP THE LIST MOD20: CMPB (R0),#40 ;END OF THIS COMMAND? BLT MOD40 ;YES JSR PC,GETC ;NO CHECK THE CHARACTER NEXT CMPB (R0)+,R5 ;MATCH? BEQ MOD20 ;YES MOD999: JMP ILLCOM ;NO - SHOW AN ILLEGAL COMMANC MOD40: JSR PC,GETCNS ;GET THE NEXT NON-SPACE CHARACTER CMP R5,#12 ;TERMINATOR? BNE MOD999 ;NO - ERROR MOVBDEFLECTION CLR (R0) ;CLEAR EXT. ADDRESS MOV (R1)+,-(R0) ;SET START BLOCK ; .IF NDF,DDCDAR ; MOV BSIZE,R3 ;GET BLOCK SIZE BOOT0: ASR R3 ;(MUST BE 2**N!) BCS BOOT1 ;FOUND THE SET BIT ASL (R0) ;ELSE TIMES 2 FOR ADDRESS ROL 2(R0) ;AND EXT. ADDRESS BR BOOT0 ;CONTINUE BOOT1: MOV (R1)+,-(R0) ;SET MEMORY ADDRESS MOV (R1)+,-(R0) ;GET BYTE COUNT CLC ;INSURE CARRY=0 ROR (R0) ;MAKE INTO WORD COUNT ADC (R0) ;ROUND UP IF NECESSARY NEG (R0) ;NOW IT IS -WORD COUNT MOV R2,-(R0)DDB, SO RESTORE ABOVE CAT =.-DELNK .END ; END OF DLN (R6)+ EMT 1 ;WAIT FOR COMPLETION NCTION DFGO2: BIT #100200,(R1) ;WAIT BEQ DFGO2 ;STILL WAITING BMI DFGO3 ;ERRRRORRRR RTS PC ;RETURN---ALL IS OK DFGO3: MOV #1,(R1) ;RESET ANY DISK CONTROL TSTB (R1) ;WAIT FOR READY BPL .-2 ;KEEP WAITING DEC DFPAR+12 ;OTHER ERRORS BEFORE? BNE DFGO ;KEEP TRYING BIT #DTR+DTL,FLAGS ;IS DECTAPE BEING USED? BEQ 2$ ;SKIP IF NOT BIT #MTAPE,FLAGS ;REALLY DECTAPE? BNE 2$ ;SKIP IF NOT MOVB #SST,@#DT.CMD ;STOP DECTAPES AT THIS POINT. 2$: RESET ;OOPS TST DSKDAE ;IS IT RK OR RP (R0),MODE ;YES - SET UP THE BYTE OFFSET FOR THE MODE BR TRA998 ;AND GET ANOTHER COMMAND ; MOD50: .ASCII 'AD50' .BYTE 0 MOD51: .ASCII 'SCII' .BYTE 2 MOD52: .ASCII 'TE' .BYTE 4 MOD53: .ASCII 'NARY' .BYTE 6 .EVEN .SBTTL *** "TRACK" AND "DENSITY" ; TRA00: JSR PC,GETNUM ;PICK UP A NUMBER JSR PC,DEN80 ;IS THE FLUSH TO THE END OF LINE GOOD? TRA01: CMP R0,#9. ;NINE TRACK? BEQ TRA02 ;YES CMP R0,#7 ;SEVEN TRACK? BNE TRA999 ;NO - ERROR MOV #10000,R0 ;SET UP TO LOOK FOR THE BI ;SET FUNCTION AND GO WAIT: TSTB (R0) ;WAIT FOR READY BPL WAIT ;KEEP WAITING TST (R0) ;CHECK FOR AN ERROR BMI ERROR ;ERROR FOUND ; .IFF ; BOOT1: MOV (R1)+,-(R0) ;SET MEMORY ADDRESS MOV (R1)+,R3 ;PICK UP BYTE COUNT INC R3 ;IN CASE ODD, GO UP ONE ASR R3 ;AND DIVIDE BY 2 MOV R3,-(R0) ;PUT IT IN EXTERNAL NEG (R0)+ ;REGISTER ASL R3 ;BACK TO NUMBER OF BYTES ADD (R0),R3 ;ADD IN BASE ADDRESS MOV (R3)+,T1 ;AND SAVE THREE WORDS FOLLOWING MOV (R3)+,T2 ;THE XFER MOV (R3),T3 ;; ; CONDITIONALIZED FOR GULF'S DDC DISC ; ; IF THERE ARE TWO DDC DISCS, THE SECOND WILL REPLACE DEC'S ; RF11. TO DO THIS, DEFINE 'DDCINT' AS THE INTERRUPT VECTOR ADDRESS OF ; THE DDC DISC (SECOND ONE) -- THE FIRST IS ALREADY SET UP AS TH 'DC' ; ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V003A ; .TITLE RMON1 ;RESIDENT MONITOR VERSION 1 3 JULY 70 ; (REVISED 7 JULY TO ALLOCATE SYSTEM VECTORS 40-57 ; AND ASSOCIATED CHANGES) ; (REVISED 6 OCT TO SEGMENT FOR RELOC? BLE 3$ ;BRANCH IF NOT MOV 2(SP),R1 ;GET UNIT NUMBER ROL R1 ROL R1 ROL R1 ROL R1 ;PUT IT IN BITS 2-0 ADD #60,R1 ;CONVERT TO ASCII MOVB R1,DKOKU ;AND STORE IN MESSAGE JSR R5,MES ;TELL HIM ABOUT THE ERROR + DKOK BR 4$ 3$: JSR R5,MES ;REPORT FAILURE + DFOK ;AND QUIT 4$: CLR VERIFY ;AVOID FALLING INTO VERIFY JMP COM11 ;CLOSE OUT MAGTAPE OUTPUT (IF ANY) ;AND ABORT ;LOAD RK11 DISK ADDRESS DFISDK: ASR R1 ;IS IT RP OR RK? MOV 6(SP),R1 ;COMPUTE DISK ADDRESS (UNIT BITT ON BR TRA03 TRA02: CLR R0 ;SET UP TO LOOK FOR THE BIT OFF TRA03: MOVB #7,SFBLK ;SET UP TO JUST GET THE STATUS .SPEC #MTLB,#SFBLK ;GO GET IT .WAIT #MTLB ;WAIT FOR IT BIC #167777,SFBSTA ;CLEAR OUT ALL BUT THE TYPE OF DRIVE CMP R0,SFBSTA ;IS THE USER CORRECT? BEQ TRA998 ;IF SO - LEAVE .WRITE #CMOLB,#TRAMES ;IF NOT, TELL THE USER HE HAS THE WRONG DRIVE JSR R5,ECHO .WORD TRAMES TRA998: JMP NEXTCM ;AND GET ANOTHER COMMAND ; ; DEN00: JSR PC,GETNUM ;GET A NUMBER CMP R5,#'D ;IS THIFOR OUR MUST BE FOUR WORD MULTIPLE XFER BIC #3,-(R0) ;ROUND WC UP TO NEXT MULT OF 4 MOV R2,-(R0) ;SET FUNCTION AND GO WAIT: TSTB (R0) ;WAIT FOR READY BPL WAIT ;KEEP WAITING TST (R0) ;CHECK FOR AN ERROR BMI ERROR ;ERROR FOUND MOV (PC)+,(R3) ;UNSAVE WORDS T3: .WORD 0 MOV (PC)+,-(R3) ;WE SAVED T2: .WORD 0 MOV (PC)+,-(R3) T1: .WORD 0 ; .ENDC ; JMP @(R1)+ ;ELSE DISPATCH .=START+200-30 ERROR: HALT ;HALT ON ERROR CMP -(R1),-(R1) ;BACK UP THE R1 TST -(R1) ;PARAMETER POATABLE ; ASSEMBLY & LINKAGE. CURRENT ; MODIFICATIONS INCORPORATED) ; .GLOBL SVT.,S.XIT,S.RSAV,S.RRES .GLOBL S.CDB,S.CDQ,S.GTB,S.RLB,RM.TRP ; ;VECTORS FOR DIRECT ACCESS TO MONITOR SEGMENTS: .=.+40 .WORD SVT. ;START OF RESMON .WORD S.XIT ;START OF COMMON EXIT .WORD S.RSAV ;START OF REGISTER SAVE .WORD S.RRES ;START OF REGISTER RESTORE .WORD S.CDB ;START OF DRIVER QUEUE .WORD S.CDQ ;START OF DRIVER DEQUEUE .WORD S.GTB ;START OF GET BUFFER .WORD S.RLB ;START OF RELEASE BUFFS) BCC DFISDP ;ITS AN RP11 DISK TST (SP)+ ;POP EXTENDED SEGMENT NUMBER BR DFDK1 DFDK2: ADD #20,R1 ;ADD INTO CYLINDER/SURFACE ADDR DFDK1: SUB #12.,(SP) ;COMPUTE CYLINDER NUMBER BGE DFDK2 ;BY DIVISION ADD #12.,(SP) ;REMAINDER IS TRACK # ADD R1,(SP) ;FULL ADDRESS NOW COMPUTED MOV #RKDA+2,R1 ;SET UP RKDA POINTER DFGO5.: BR DFGO5 ;THE REST IS COMMON ;LOAD RC11 DISK ADDRESS REGISTER DFISDC: TST (SP)+ ;DON'T NEED EXTENDED SEG # FOR DDC DISC MOV #RCDAR+2,R1 ;SET UP R1 MOV #400,S 800 BPI DUMP MODE? BEQ DEN50 ;POSSIBLY JSR PC,DEN80 ;GOOD FLUSH TO END OF LINE? CMP R0,#800. ;YES - 800 BPI? BEQ DEN01 CMP R0,#556. ;556 BPI? BEQ DEN02 CMP R0,#200. ;200 BPI? BNE TRA999 ; NONE - ERROR CLRB DENTRK ;SET UP FOR 200 BPI OPERATION BR DEN40 ;ISSUE THE .SPEC AN LEAVE DEN01: MOVB #2,DENTRK ;SET UP FOR 800 BPI - NO DUMP MODE BR DEN40 ;AND ISSUE THE .SPEC DEN02: MOVB #1,DENTRK ;SET UP FOR 556 BPI OPERATION BR DEN40 ;DO IT DEN50: JSR PC,GETC ;ON TO THE NEXT CHARAINTER BR INIT00 ;AND RETRY BLOCK: .WORD 0 ;START BLOCK LOAD: .WORD 0 ;LOAD ADDRESS COUNT: .WORD 0 ;BYTE COUNT XFER: .WORD 0 ;TRANSFER ADDRESS BSIZE: .WORD 64. ;BLOCK SIZE BEGIN: .WORD 37250 ;BOOTSTRAP START EXTRPG: ;EXTERNAL PAGE ADDRESS .IIF NDF,DDCDAR, .WORD 177460 .IIF DF,DDCDAR, .WORD DDCDAR-6 INDEX: .WORD 4 ;MONLIB.SYS START END: .END ER ;TRAP FOR NON-INITIALISED HARDWARE VECTORS: .=.+374-60 JMP RM.TRP ; SYSTEM VECTOR TABLE (SVT) ; THIS TABLE CONTAINS SYSTEM CONSTANTS ; AND POINTERS TO VARIOUS MAJOR SYSTEM AREAS, ; WHERE THESE MAY BE ACCESSED INDIRECTLY THRU ; VECTOR AT 40 ; THE SVT IS LOCATED AT THE BEGINNING ; OF THE MONITOR (NORMALLY LOC 400). ; ALL NAMES OF SVT ELEMENTS WILL BE ; EXTERNALLY DEFINED. ; .GLOBL SVT.,EOM,TOB,CSA,PLA,SCW,BAT,DCO .GLOBL MUS,OSW,PSA,DSA@#RCDAR-6 ;CLEAR CONTROL ASL (SP) ;MULTIPLY BLOCK NUMBER BY FOUR ASL (SP) ;TO ALLOW FOR 256. WORD BLOCKS BR DFGO5 ;AND PRETEND WE ARE AN RF11 DFGO6: TST PFMT ;FORMATTING SPECIFIED ? BEQ 1$ ;NO,FORGET IT JSR PC,FORMAT ;GO FORMAT A PACK CLR PFMT ;ONE TIME ONLY 1$: TST V4A ;CHECK FLAG BEQ DFGO7 ;NOT SET SO CONTINUE CLR V4A ;ONE TIME ONLY MOV DFPAR+6,-(SP) ;SAVE SECTOR COUNT MOV #1,DFPAR+6 ;SET SECTOR COUNT TO 1. MOV 10(SP),-(SP) ;GET UNIT NUMBER FOR RK JSR PC,DFGO ;READ/CTER JSR PC,DEN80 ;GOOD FLUSH TO THE END? CMP R0,#800. ;GOOD DENSITY? BNE TRA999 ;NO - ERROR MOVB #3,DENTRK ;SET UP FOR 800 BPI DUMP MODE DEN40: MOVB DENTRK,SFBLK+5 ;SET UP TO ISSUE A .SPEC MOVB PARITY,SFBLK+4 ;TO SET THIS ALL IN OPERATION MOVB #6,SFBLK ;SET IN THE FUNCTION CODE .SPEC #MTLB,#SFBLK ;DO IT BR TRA998 ;AND LEAVE DEN80: CMP R5,#40 ;SPACE FOLLOWING THE NUMBER? BEQ DEN81 ;YES CMP R5,#12 ;TERMINATOR FOLLOWING? BNE DEN89 ;NO - ERROR RTS PC ;YES - ALL IS WELL DEN8; ; THIS IS SET UP TO HANDLE A SECOND DDC DISC. IF YOU DESIRE TO REPLACE ; THE STANDARD DEC RF11 WITH THE SECOND DDC DISC, SIMPLY DEFINE 'DDCINT' ; AS THE INTERRUPT VECTOR ADDRESS FOR THE SECOND UNIT. ; ; (THE FIRST DDC DISC IS SET UP AS THE 'DC' DEVICE) ; ; COPYRIGHT DIGITAL EQUIPMENT CORPORATION 1972 ; MAYNARD,MASSACHUSETTS. ; .TITLE CMDEVL .GLOBL CMDEVL .IDENT /EDIT05/ ;LAST EDIT 10-AUG-72 ; ; ; ; ; .SBTTL GLOBL ASSIGNMENTS. ; ;GLOBL ASSIGNMENTS. ; .GLOBL TTYLIN ;TELEP ,RSA,WRA,DAT,TOD .GLOBL UIC,PGN,MRT,DDL,SSP,ENDM,MRT.,DDL. .GLOBL BFS,BFE,BF.STR,BF.END,WTL,KBA,MSB,MSB. ; SVT.: EOM: .WORD ENDM ; END OF PERMANENT MONITOR TOB: .WORD ENDM+14 ; END OF BUFFER AREA CSA: .WORD 37776 ; LAST ADDRESS IN AVAILABLE CORE PLA: .WORD 0 ; PROGRAM LOAD ADDRESS SCW: .WORD 1 ; SYSTEM CONFIGURATION INDICATORS BAT: .WORD 0 ; POINTS TO DYNAMIC ASSIGNMENT TABLE DCO: .WORD 0 ; CHAIN OF INITED DDBS MUS: .BYTE 0,0 ; MONITOR USER SWITCH OSW: .WORD 0 ; OTHER SWITCH PSA: !WRITE BOOTSTRAP TST (SP)+ ;FLUSH UNIT NUMBER MOV #DFPAR+6,R4 ;RESTORE R4.... DEC (SP) ;UPDATE SAVED SECTOR COUNT MOV (SP)+,(R4) ;AND RESTORE IT ADD #1000,-(R4) ;UPDATE BUFFER ADDRESS MOV #17.,2(SP) ;SKIP TO SECTOR 17 (LEAVES ROOM FOR MFD) MOV #ILB+2,-(SP) ; MOV #ILB,-(SP) ; CMP #RFUN,DFPAR+10 ;READ OR WRITE ? BEQ 2$ ;READ, SO BRANCH MOV #OLB+2,2(SP) ; MOV #OLB,(SP) ; 2$: ADD #16.,@(SP)+ ; UPDATE SECTOR NUMBER ADC @(SP)+ ; JMP DFGO7 ;AND FINISH REQUEST ;HANDLE RP11C/RP03"1: JSR PC,GETCNS ;GET NEXT NON-SPACE CHARACTER CMP R5,#12 ;TERMINATOR? BEQ DEN81-2 ;YES - LEAVE DEN89: TST (SP)+ ;NO - ERROR - POP THE RETURN ADDRESS TRA999: JMP ILLCOM ;AND SHOW AN ILLEGAL COMMAND .SBTTL *** "PARITY", "WEOF", AND "REWIND" PAR00: JSR PC,GETCNS ;GET NEXT NON-SPACE CHARACTER MOV R5,R0 ;SAVE THE CHARACTER JSR PC,GETCNS ;PICK UP THE NEXT CHARACTER JSR PC,DEN80 ;IS THE FLUSH TO THE END OF LINE GOOD? CMP R0,#'E ;YES - IS IT EVEN PARITY DESIRED? BEQ PAR01 ; YES CMP R#RINTER ROUTINE. .GLOBL SWER,UNKN ;ASCII MESSAGES. .GLOBL SYNERR,DEVERR .GLOBL INPERR,SWCNER .GLOBL MNYERR,SWERR .GLOBL CONVRT ;CONVERT DECIMAL TO BINARY. .GLOBL WRKBLK,CSIBLK ;PTRS FOR CSI1,2. .GLOBL CSXCAL,CSMCAL ;SUBR FOR CSX,CSM . .GLOBL RKSTRT,RKSZ ;BOOTSTRAP AND SIZE ROUTINES. .GLOBL RPSTRT,RPSZ ;BOOTSTRAP ONLY. .GLOBL RFSTRT,RFSZ ;BOOTSTRAP AND SIZE. .GLOBL RCSTRT,RCSZ .GLOBL ERROR1,ER1 ;ERROR PROCESSOR. .GLOBL INPLNK,LPTR1 ;LINK BLOCK,LINE BUFFER PTR. .GLOBL OUTFIL,BLOC$.WORD 0 ; PROGRAM START ADDRESS DSA: .WORD 0 ; DDT STARTING ADDVESS RSA: .WORD 0 ; RESTART ADDRESS WRA: .WORD WTL ; WAIT RETURN ADDRESS DAT: .WORD 0 ; DATE IN JULIAN - 70,000 TOD: .WORD 0,0 ; TIME OF DAY CLOCK CELLS UIC: .WORD 0 ; USER IDENTIFICATION CODE PGN: .WORD 0,0 ; PROGRAM NAME (MOD 40) MRT: .WORD MRT. ; START OF RESIDENCY TABLE DDL: .WORD DDL. ; START OF DEVICE LIST SSP: .WORD 0 ; STACK POINTER SAVE (DUMP) BFS: .WORD BF.STR ; START OF BUFFER ALLOC. TABLE BFE: .WORD BF.END % DISKS DFISDP: SWAB R1 ;UNIT NUMBER TO BITS 7-5 ASL R1 ;MOVE TO BITS 8-10 ASL R1 ASL R1 ADD R1,DFPAR+10 ;AND MAKE IT PART OF FUNCTION. ;CONVERT SECTOR NUMBER TO DISK ADDRESS MOV (SP)+,R1 ;GET HIGH ORDER SECTOR NUMBER MOV (SP),R3 ;RPDA IS BUILT IN R3 CLR (SP) ;STACK CONTAINS CYLINDER ADDR. BR DFDP1 DFDP2: INC (SP) ;COUNT CYLINDER DFDP1: SUB #200.,R3 ;THERE ARE 200 SECTORS PER CYLINDER SBC R1 ;CARRYON BHIS DFDP2 ;REMEMBER THAT SECTOR CAN BE GT 32K ADD #200.,R3 ;RESET VALUE &0,#'O ;ODD? BNE TRA999 ;NO - ERROR CLRB PARITY ;CLEAR THE BYTE TO SHOW ODD PARITY BR DEN40 ;AND GO SET IT UP PAR01: MOVB #1,PARITY ;SET THE BYTE TO 1 TO SHOW EVEN PARITY BR DEN40 ;NOW ISSUE THE COMMAND TO SET IT UP ; ; WEO00: JSR PC,GETNUM ;GO GET A NUMBER JSR PC,DEN80 ;CHECK TO END OF LINE FOR GOOD SYNTAX CLR SFBINF ;CLEAR THE INFO GIVEN IN THE SPEC FUNCTIONS BLOCK MOVB #2,SFBLK ;SET THE WRITE END OF FILE CODE IN THE BLOCK WEO01: JSR PC,DOSPEC ;ISSUE THE SPECIAL FUNCTION BR WEO'KS .GLOBL OUTADR,OUTLNK ; ; .GLOBL CMDTXT ;TEXT OF COMMAND LINE. .GLOBL INPFIL ;INPUT FILE BLOCK. .GLOBL SWITCH ;SWITCHES SET HERE. .GLOBL OUTSW .GLOBL NS.FB .GLOBL NS.SIZ .GLOBL DESIZE .SBTTL DIRECT ASSIGNMENTS. ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ZEROSW=000001 ; BIT 0=/ZERO SWITCH MASK. BOOTSW=000002 ; BIT 1=/BOOT SWITCH MASK. HOOKSW=000004 ; BIT 2=/HOOK SWITCH MASK. BLOKSW=000010 ; BIT 3= /BLOCKS MASK. NS(; END OF BUFFER ALLOC TABLE WTL: BR . ; WAIT LOOP FOR WAITS KBA: .WORD 0 ; POINTER TO KB IN DDL MSB: .WORD MSB. ; POINTER TO MAIN SWAP AREA ; .EOT ;MONITOR RESIDENCY TABLE: ; RESIDENT TABLE SHOWING CURRENT LOCATION OF ; MONITOR SERVICE ROUTINES ;FORMAT:- ; 1 WORD FOR EACH ENTRY WITH THE POSITION OF EACH ; BEING RELATIVE TO THE EMT CALL CODE ; 1) ROUTINE IS CORE-RESIDENT: ; ; CORE ADDRESS (BIT 0 =0) ; ; 2) ROUTINE IS ONLY AVAILABLE IN DISK L) BR DFDP3 DFDP4: ADD #400,R3 ;INCREMENT TRACK ADDR SUB #10.,R3 DFDP3: CMPB R3,#10. ;ARE WE THERE? BHIS DFDP4 ;NO CONTINUE COUNTING MOV #RPDA,R1 MOV R3,(R1) BR DFGO5. FORMAT: JSR R5,REGSAV ;SAVE ALL REGISTERS FMT1: CMP DSKDAE,#1 ;IS IT AN RK ? BEQ 2$ ;YES, GO FORMAT CMP DSKDAE,#2 ;IS IT AN RP ? BNE FMTKIL ;NOPE,ERROR JSR R5,INPUT ;"SET FORMAT ENABLE SWITCHES" + FMTENB ;AND WAIT FOR CR REPLY CMPB (R0),#15 ;WAS IT REALLY A CR BNE FMTKIL ;ASSUME HE WANTS TO ABORT JMP FMTRP*03-2 ;IF AN ERROR - RETURN FOR THE NEXT COMMAND BIT #1000,SFBSTA ;ARE WE AT THE END OF THE TAPE? BNE WEO02 ;IF SO - TELL THE USER DEC R0 ;DECREMENT THE COUNT BGT WEO01 ;AND CONTINUE UNTIL FINISHED BR REW01 ;DONE - GET ANOTHER COMMAND WEO02: DEC R0 ;COUNT DOWN THE ONE WE DID BEQ REW01 ;IF FINISHED ANYWAY, LEAVE MOV R0,R1 ;SET UP TO CALL THE NUMBER OUTPUT WEO03: MOV #WEOMES,R0 ;ROUTINE JSR R5,NUMOUT ;DO IT .WORD 12 ;IN BASE TEN .WRITE #CMOLB,#WEOMSS ;WRITE THE MESSAGE JSR R5+SW =000020 ; BIT 4= /NS MASK. FORMAT=000040 ; BIT 5= /FORMAT. ; ; ; CR =15 ; .SBTTL CMDEVL- COMMAND STRING EVALUATOR. ; ;EVALUATE USER'S COMMAND STRING. ; ;THIS ROUTINE REQUIRES ONE INPUT AND ONE OUTPUT DATASET. ;IF ERRORS ARE ENCOUNTERED CONTROL GOES TO 'ERROR' WITH ;R0 POINTING TO THE TEXT MESSAGE TO BE PRINTED. ; ;THE SYNTAX IS CHECKED FIRST( VIA CSX). IF OK THE DATASETS ;ARE BUILT VIA CSM. IF NULL DATASETS OCCUR COMPLAIN AND ;RESTA,IBRARY: ; ; NO. OF BLOCKS (BITS 15-14 - 0:=4) ; DISK START BLOCK (BITS 13-1) ; NON-CORE RESIDENT SWITCH (BIT 0 = 1) ; ; 3) ROUTINE IS NOT AVAILABLE: ; ; 000001 ; ;GENERATED AT SYSTEM BUILD TO SHOW CORE RESIDENCY OF ; ONLY THOSE ROUTINES FORMING PART OF THE ; PERMANENTLY RESIDENT MONITOR ;USED BY:- ; 1) RUN-TIME LOADER: ; ENABLES MODIFICATION OF THE RESIDENT ; MONITOR TO MEET USER PROGRAM SPECIFICATIONS ; (TABLE IS UPDATED TO SHOW CURRENT SITUATION) ; 2) EMT HANDLER: ; USED AS- ;GO FORMAT RP 2$: JSR R5,MES ;TYPE + FMTBGN ;"STARTING RK FORMAT PASS" JMP FMTRK ;GO FORMAT RK FMTDNE: CMP DSKDAE,#2 ;WAS THAT AN RP FORMAT ? BNE 1$ ;NO,TWAS RK JSR R5,INPUT ;"DISABLE FORMAT SWITCHES" + FMTDSB ;WAIT FOR ANY REPLY BR 2$ ;RESTORE REGISTERS AND CARRY ON 1$: JSR R5,MES ;TYPE + FMTEND ;"END RK FORMAT PASS" 2$: JSR R5,REGRES ;RESTORE ALL REGISTERS RTS PC ;GET ON WITH IT FMTBAD: JSR R5,MES ;ERROR IN FORMATTING + FMTERR ;"FORMATTING FAILED - RESTART" JMP .,ECHO .WORD WEOMSS BR REW01 ;AND GET ANOTHER COMMAND ; DOSPEC: .SPEC #MTLB,#SFBLK ;ISSUE THE EMT TO THE MONITOR .WAIT #MTLB ;WAIT FOR THE OPERATION TO COMPLETE TST SFBSTA ;WAS THERE AN ERROR? BPL DOSPEX ;IF NOT, LEAVE .WRITE #CMOLB,#SPFERR ;WRITE OUT A MESSAGE JSR R5,ECHO .WORD SPFERR RTS PC ;AND EXIT DOSPEX: ADD #2,(SP) ;UP TO THE NON-ERROR RETURN RTS PC ;AND LEAVE ; ; REW00: JSR PC,GETUNT ;PICK UP A UNIT NUMBER JSR PC,DEN80 ;CHECK FOR GOOD SYNTAX MOVB RUNUNT,-(SP) ;SA/RT THE MAIN PROGRAM AT 'RESTRT'. ; ;IF THE DATASETS ARE ACCEPTABLE CALL 'SWEVAL' TO EVALUATE ;THE SWITCH SEQUENCE OF THE OUTPUT DATASET. ; ;CALLING SEQUENCE: ; JSR PC,CMDEVL ;LINE IS AT 'CMDLIN'. ; ;RET HERE IF 100% CORRECT. ; ;THIS ROUTINE SETS THE FOLLOWIN PARAMETERS: ; 1. SWITCH INDICATES WHAT SWITCHES WERE SET. ; 2. BLOCKS 0 OR VALUE SPECIFIED BY /BL SWITCH. ; 3. NS.FB 0 OR VALUE FROM /NS SWITCH. ; 4. NS.SIZ " " " ; ; CMDEVL: MOV #CSIBLK,R1 ;3-WORD BLOCK FOR CSM. MOV #2,@(R1)+ ;SE0 A DESPATCH TABLE TO RESIDENT ; ROUTINES OR TO PROVIDE ARGUMENTS FOR CALL ; TO SWAP AREA MANAGER. ; (NON-EXISTENT ROUTINES GIVE ERROR DIAGNOSTIC) ; 3) SWAP AREA MANAGER: ; INFO RECEIVED FROM EMT HANDLER IS USED AS ; CONTROL DATA FOR CHECKING CURRENT OCCUPANCY ; OF MONITOR SWAP BUFFER AND FOR DISK INWARD ; TRANSFER ; (N.B. COPY OF BASIC TABLE (PERMANENT RESIDENT MONITOR ONLY) ; WILL BE HELD ON DISK FOR RESTORATION ; OF CORE IMAGE AT PROGRAM TERMINATION) 1COMCON ;RESTART FMTRDY: JSR R5,INPUT ;"DRIVE NOT READY - TYPE CR WHEN READY" + FMTRDI ;WAIT FOR CR CMPB (R0),#15 ;DID HE TYPE CR ? BEQ FMT1 ;RETRY FORMATTING ON CR FMTKIL: JSR R5,MES ;TYPE MESSAGE + FMKILL ;"REQUEST KILLED" JMP COMCON ;START ALL OVER ;FORMAT AN RK DISK ; ; FMTRK: MOV RKOUT,R0 ;GET DIRIVE NUMBER BIC #17777,R0 ;ONLY TOP 3 BITS MOV R0,RKDA ;SET DISK ADDRESS MOV #1,RKCS ;RESET CONTROLLER MOV R0,RKDA BIT #100,RKDS BEQ 1$ TSTB RKDS BMI 2$ 1$: JMP FM2VE THE CURRENT UNIT ON THE STACK MOVB R0,RUNUNT ;SET THE UNIT NUMBER TEMPORARILY IN JSR PC,RUN01 ;RELEASE AND INIT TO THE NEW UNIT MOVB #3,SFBLK ;SET THE SPECIAL FUNCTION BLOCK CODE IN CLR SFBINF ;CLEAR THE INFORMATION PASSED TO ZERO .SPEC #MTLB,#SFBLK ;ISSUE A SPECIAL FUNCTION BLOCK CALL .WAIT #MTLB ;WAIT FOR THE SYSTEM TO FINISH MOVB (SP)+,RUNUNT ;SET THE RUN UNIT BACK TO WHATEVER IT WAS JSR PC,RUN01 ;RELEASE AN INIT BACK TO THE OLD UNIT REW01: JMP NEXTCM ;AND GET THE NEXT COMMAND 3T FOR OUTPUT DATASET. JSR PC,CSXCAL ;EVALUATE SYNTAX FIRST. MOV (SP)+,R2 ;SYNTAX OK? BEQ CMDV10 ;YES..GET SEMANTICS. MOVB #'?,(R2)+ ;NO..ECHO LINE UP TO ERROR CHAR. MOVB #CR,@R2 ;LINE TERMINATOR. MOV #CMDTXT,R0 ;SET FOR TYPING. JSR PC,TTYLIN BR CMDER1 ;PRINT ERROR. ;THE SYNTAX IS CORRECT. SET UP THE OUTPUT POINTERS ;IN CSIBLK FOR THE LINK AND FILE BLOCK INTRIES. ; ; CMDV10: MOV #OUTLNK,(R1)+ ;OUTPUT LINK BLOCK. MOV #OUTFIL,@R1 ;FILE BLOCK4 .GLOBL MRT.,EMT.,SAM.,M.IOMX,M.EMAX ; SECTION A - I/O CALLS .GLOBL RWN,RWR,INR,RLS,TRA,BLO,SPC,STT .GLOBL DIR,ALO,OPN,CLS,REN,DEL,APP,GAR,PRO MRT.: .WORD EMT. ;.WAITR (IN EMT HANDLER) 0 .WORD EMT. ;.WAIT (IN EMT HANDLER) 1 .WORD RWN ;.WRITE 2 .WORD RWR ;.RLWR (NYA) 3 .WORD RWN ;.READ 4 .WORD RWR ;.RLRD (NYA) 5 .WORD INR ;.INIT 6 .WORD RLS ;.RLSE 7 .WORD TRA ;.TRAN 10 .WORD BLO ;.BLOCK (NYA) 11 .WORD SPC ;.SPEC (NYA) 12 .WORD STT ;.STAT (NYA) 13 .WORD DIR ;.5TRDY ;DRIVE IS NOT READY 2$: CLR RKMA CLR RKWC MOV #15,RKCS ;ISSUE HOME SEEK FMTRK1: TSTB RKCS ;WAIT BPL FMTRK1 BIT #100,RKDS ;WAIT FOR DRIVE READY BEQ FMTRK1 TST RKCS BPL FMTRK2 ;BRANCH IF NO ERROR FMTRKX: JMP FMTBAD ;PRINT FMT FAIL MSG.RESTART FMTRK2: MOV R0,RKDA ;SET DRIVE NUM AGAIN FMTRK3: MOV #-1,RKWC ;SET WORD COUNT=1 CLR RKMA ;CLEAR CORE ADDR MOV #2003,RKCS ;ISSUE WRITE EMT FMTRK4: BIT #100200,RKCS ;WAIT BEQ FMTRK4 BPL FMTRK3 ;BRANCH IF NOT DONE ADD #14533,R0 ;C6 .SBTTL *** "BACKSPACE", "FORWARDSPACE", "SKIPFILE", AND "BACKFILE" ; BAC00: MOVB #5,SFBLK ;SET UP THE FUNCTION TO A BACKSPACE BR FOR01 ;AND LET THE FORWARDSPACE FUNCIONING DO THE WORK ; ; FOR00: MOVB #4,SFBLK ;SET UP FOR FORWARD SPACE OPERATIONS FOR01: JSR PC,GETNUM ;GO GET A NUMBER JSR PC,DEN80 ;AND CHECK FOR VALIDITY OF THE LINE MOV R0,SFBINF ;SET UP OUR COUNT CLR SFBRET ;ZERO THE RESIDUAL COUNT .SPEC #MTLB,#SFBLK ;DO THE STUFF .WAIT #MTLB ;WAIT FOR IT TST SFBRET ;RESIDUAL COUNT7. CMDV15: JSR PC,CSMCAL ;GET SEMANTIC OF OUTPUT SET. MOV (SP)+,R2 BIT #4,R2 ;WAS DEVICE SPECIFIED? BNE CMDER2 ;NO... NO DEFAULTS,COMPLAIN. TST R2 ;IF 0, TOO MANY DATASETS. BEQ CMDER3 DEC R2 ;IF NOT 0, TOO MANY SWITCHES. BNE CMDER4 TST WRKBLK ;INPUT DATASET CHECKED? BEQ SWEVAL ;YES..GO PROCESS SWITCHES. CLR WRKBLK ;SET FOR INPUT DATASET. MOV #INPFIL,@R1 ;INPUT FILE BLOCK MOV #INPLNK,-(R1) ;INPUT LINK BLOCK. BR CMDV15 ; ;ERRORS IN COMMAND LINE. ; CMDER1: MOV #SYNERR,R08DRECT 14 .WORD ALO ;.ALLOC 15 .WORD OPN ;.OPEN 16 .WORD CLS ;.CLOSE 17 .WORD REN ;.RENAM 20 .WORD DEL ;.DELET 21 .WORD APP ;.APPND 22 .WORD GAR ;.GRBGE 23 .WORD PRO ;.PRTCT 24 .WORD 1,1,1 ;(SPARES) 25-7 M.IOMX=27 ;MAX. I/O EMT CODES ; SECTION B - CALLS USING SUBSIDIARY SWAP AREA ; .GLOBL SM.SPE,KBL,EDP,KBI,GNM ; .WORD SM.SPE ;SAM CALL FOR KBI. OVLY 30 .WORD KBL ;KBD CMD LISTENER 31 .WORD EDP ;DIAGNOSTIC PRINT 32 .WORD KBI ;9HECK OF PAST LAST CYL CMP R0,RKDA BHI FMTRKX ;IF NOT, ERROR MOV #1,RKCS ;ISSUE CONTROL RESET 1$: BIT #100200,RKCS ;WAIT FOR CONTROLLER READY BEQ 1$ ; BMI FMTRKX ;BRANCH ON ANY ERROR JMP FMTDNE ;FORMAT AN RP DISK ; FMTRP: INCB RPCS+1 CLR RPCS ;BYPASS HARDWARE CROCK CLR RPDA CLR RPCA CLR RPMA CLR RPWC MOVB RKOUT+1,R0 ;GET UNIT BITS ASL R0 ;GOTTA BE IN BITS 8-10 ASL R0 ; ASL R0 ; BIC #174377,R0 ;CLEAR OUT ALL JUNK MOV R0,RPCS ;SET DISK UNIT INC RPCS ;RESET C:? BEQ REW01 ;NONE - LEAVE MOV SFBRET,R1 ;SET UP TO TELL THE USER BR WEO03 ;THAT SOMETHING WAS LEFT ; ; ; SKI00: MOVB #4,SFBLK ;SET UP TO GO FORWARD BR BAF01 ;AND LET THE BACKSPACEFILE FUNCTION DO IT ; ; BAF00: MOVB #5,SFBLK ;SET UP TO RUN BACKWARDS BAF01: JSR PC,GETNUM ;GO GET A NUMBER JSR PC,DEN80 ;AND BE CERTAIN THAT THE SYNTAX WAS CORRECT MOV #3777,SFBINF ;SET UP TO SKIP MANY RECORDS BAF03: JSR PC,DOSPEC ;ISSUE THE SPACING FUNCTION BR WEO02 ;IF AN ERROR - TELL THE USER BIT ; ;SYNTAX ERROR. BR SW.ER0 CMDER2: MOV #DEVERR,R0 ;DEVICE SPECIFICATION ERROR. BR SW.ER0 CMDER3: MOV #MNYERR,R0 ;TOO MANY DATASETS. BR SW.ER0 CMDER4: MOV #SWERR,R0 ;TOO MANY SWITCES. BR SW.ER0 .SBTTL SWEVAL -SWITCH EVALUATOR. ; ;1. THE /ZE SWITCH CAUSES THE FILE STRUCTURE TO BE ; INITIALZED AND THE CIL DATASET TO BE THE ; FIRST AND ONLY FILE IN UIC [1,1]. IF THE /ZE ; SWITCH IS NOT USED, THE FILE STRUCTURE IS UNKNOWN ; ;2. THE /HK CA<KBD CMD INTERPRETER 33 .WORD GNM ;GET NEW BIT-MAP (R/W) 34 .WORD 1,1,1 ;(SPARES) 35-7 ; SECTION C - OTHER MONITOR SERVICES ; .GLOBL GUT,CVT,FOP,FCR,FCL .GLOBL LUK,LBA,GMA,CBA,CKX,DLN,DCN,AP2 .GLOBL CSX,CSM,XIT,LDR,LD2,MTO ; .WORD SM.SPE ;SAM CALL FOR MSB OVLY 40 .WORD GUT ;GENERAL UTILITY 41 .WORD CVT ;GENERAL CONVERSION 42 .WORD FOP ;FILE OPEN (I,E,U,C) 43 .WORD FCR ;FILE OPEN (O) 44 .WORD FCL ;FILE CLOSE 45 .WORD LUK ;FILE KOOK-UP 46 .WORD LBA ;FILE BLOCK ALLOC 47 .WOR=ONTROLLER MOV R0,RPCS TST RPDS BMI .+6 JMP FMTRDY ;DISK NOT READY MOVB #15,RPCS ;ISSUE HOME SEEK FMTRP1: TSTB RPCS ;WAIT BPL FMTRP1 TST RPDS ;WAIT FOR DRIVE READY BPL FMTRP1 TST RPCS BPL FMTRP2 ;BRANCH IF NO ERROR FMTRPX: JMP FMTBAD ;PRINT FMT FAIL.RESTART FMTRP2: BIS #14000,RPCS ;SET HEADER AND PDP10 BIT MOV #-3,RPWC ;SET WORD COUNT CLR RPMA ;CLEAR MEMORY ADDR MOVB #3,RPCS ;ISSUE WRITE (FMT) FMTRP3: BIT #100200,RPCS ;WAIT BEQ FMTRP3 BMI FMTRPX ;BRANCH IF ERROR >#1400,SFBSTA ;WAS THERE AN EOT OR BOT ENCOUNTERED? BNE WEO02 ;IF SO, TELL THE USER ABOUT IT TST SFBRET ;WAS A RESIDUAL RETURNED? BEQ BAF03 ;YES - DO IT AGAIN, WE HIT A LONG FILE DEC R0 ;NO - COUNT THIS ONE BGT BAF03 ;IF MORE, DO IT BR REW01 ;IF NOT, GET ANOTHER COMMAND .SBTTL *** "DUMP" ; ; DUM00: JSR PC,GETNUM ;GO GET THE NUMBER OF RECORDS TO DUMP JSR PC,DEN80 ;CHECK THE SYNTAX MOV R0,POINT ;SET THE NUMBER IN A SAFE PLACE ; DUM01: .TRAN #MTLB,#MTRNBK ;READ A BLOCK .WAIT #M?USES THE OUTPUT CIL TO BE HOOKED ; INTO THE BOOTSTRAP OF BLOCK 0. ; ;3. THE /BOOT SWITCH CAUSES THE OUTPUT CIL TO ; BE BOOTED INTO OPERATION AT SYSLD COMPLETION. ; ;4. THE BLOCKS SWITCH RESERVES N BLOCKS FOR THE CIL ABOUT ; TO BE CREATED. WITH THE NS SWITCH IT IS USED TO ; MAKE SURE THE CIL DOES NOT EXCEED THE # OF BLOCKS SPECED. ; ;5. /NS IS USED TO SPECIFY NON-STANDARD FILE STRUCTURE. ; THE CIL IS LOADED WITHOUT REGARD TO ANY FILE ; STRUCTURE.IF NS IS USED THE FOLLOWING@D GMA ;FILE GET BIT-MAP 50 .WORD CBA ;FILE CONTIG ALLOC 51 .WORD CKX ;FILE CHECK ACCESS 52 .WORD DLN ;FILE DELETE LINKED 53 .WORD DCN ;FILE DELETE CONTIG 54 .WORD AP2 ;FILE APPEND PART II 55 .WORD CSX ;COMMAMD SYNTAX ANALYSIS 56 .WORD CSM ;COMMAND STRING MANIPUL. 57 .WORD XIT ;.EXIT PROCESSOR 60 .WORD LDR ;PROGRAM LOADER 61 .WORD LD2 ; - " - ,PT 2 62 .WORD MTO ;SEQ. MAGTAPE OPEN 63 .WORD 1,1,1,1 ;(SPARE) 64-67 M.EMAX=67 ;MAX. EMT CODES (RE-ASSIGN IF EXTENDED) ; .EOT A TST RPCA ;CYLINDER ADDRESS SHOULS BE ZERO BNE FMTRPX ;ERROR IF NOT BIC #4000,RPCS ;CLEAR HEADER ON BIT JMP FMTDNE ;DECTAPE ROUTINES------- ;INPUT FROM DECTAPE--- DTIN: MOVB #DTAR,DTPAR ;WE WANT RO READ DATA MOV ILB,R0 ;GET LOGICAL BLOCK WE WANT JSR PC,LBCHK ;SEE IF IT'S FIRST ON REEL BEQ DTIN2 ;IT IS--A LITTLE LABEL CHECKING THEN DTIN1: MOVB (R2),DTPAR+1 ;MAP PHYSICAL UNIT # MOV #BUF,DTPAR+4 ;CORE ADDRESS MOV R0,DTPAR+2 ;DECTAPE BLOCK # WANTED MOV ILBEND,R0 ;LAST BLOCK TO READ BTLB ;WAIT FOR IT TO SHOW UP CMP TRNWC,BUFSIZ ;DID WE READ ANYTHING? BEQ DUM50 ;NO - TELL THE USER THAT WE HIT THE EOF TSTB TRNSTA ;WERE THERE ANY ERRORS? BPL DUM02 ;NO .WRITE #OUTLB,#DUMEMS ;YES - TELL THE USER OF A POSSIBLE LARGE RECORD DUM02: MOV BUFSIZ,R4 ;FIND OUT HOW MANY WORDS WE READ SUB TRNWC,R4 ;BY SUBTRACTING WHAT DID NOT COME IN MOV R4,R1 ;SET IT IN R1 FOR THE OUTPUT MOV #DUMME2,R0 ;SET UP THE MESSAGE ADDRESS JSR R5,NUMOUT ;TURN THE BINARY INTO ASCII .WORD 12 ;IN BASEC MUST BE TRUE: ; A) THE VALUE GIVEN MUST BE 64., 256., ; OR ; B) THE VALUE GIVEN MUST MATCH THE ONE IN THE ; LICIL(SAME VALUE FOR CILUS/SYSLD REQUIRED). ; ; SWEVAL: MOV #SWITCH,R4 MOV R4,-(SP) ;SAVE POINTER. CLR (R4)+ ; SWITCH. CLR (R4)+ ; BLOCKS CLR (R4)+ ; NS.SIZ CLR (R4)+ ; NS.FB MOV (SP)+,R4 ;RESTORE PTR. MOV #OUTSW,R0 ;OUTPUT DATASET SWITCHES. SWEV10: MOV @R0,R2 ;#OF WORDS IN SW. BEQ CKCN ;NO. MORE SWITCHES ASL R2 ;CONVERT TO BYTES ADD R0,R2 ;POINT TO SW. D ;DEVICE DRIVER LIST VERSION 1 17 JUN 70 ; RESIDENT TABLE SHOWING AVAILABILITY OF ; DEVICE DRIVERS AND THEIR CURRENT ; LOCATION ;FORMAT:- ; 4 WORDS PER ENTRY (POSITION IMMATERIAL EXCEPT ; THAT THE ENTRY FOR THE SYSTEM DISK ; MUST BE FIRST) ; GENERAL FORM: ; ; WORD 1: DEVICE NAME (PACKED RADIX 50) ; WORD 2: CORE LOAD ADDRESS OR 0 ; WORD 3: INTERRUPT VECTOR ADDRESS ; WORD 4: DISK START BLOCK (BITS 15 - 6) ; E JSR R5,ROOM1 ;COMPUTE NUMBER OF BLOCKS TO READ + DTPAR+2 ;CURRENT BLOCK TO READ + DTPAR+6 ;NUMBER OF BLOCKS STORED HERE SUB DTPAR+6,DTIBC ;DO WE HAVE THEM ON THIS REEL? BPL DTIN10 ;YES ;HACK--WE DON'T SEEM TO HAVE THE RIGTH NUMBER OF BLOCKS ON THIS REEL ;HOWEVER, WE WANT TO FINISH WITH THE BLOCKS WE DO HAVE BEFORE WE QUIT. MOV BUFSIZ,-(SP) ;SAVE BUFSIZ ADD DTIBC,DTPAR+6 ;CHANGE TO SHOW HOW MANY BLOCKS WE HAVE BEQ DTIN6 ;HEY--THERE IS NOTHING THERE! JSR PC,DTG ;READ JUST A FEW BLOCF TEN .WRITE #OUTLB,#DUMME1 ;TELL THE USER HOW LARGE THE RECORD WAS MOV BUFADR,R3 ;SET UP THE POINTER TO THE DATA READ CLR R5 ;CLEAR THE POSITIONAL POINTER MOVB MODE,R2 ;SET UP FOR THE MODE CALL MOV DUMTAB(R2),R2 ;ADDRESS IS NOW IN R2 ; DUM03: MOV #DUMME3,R0 ;SET UP FOR CLEARING THE BUFFER TO SPACES MOV #63.,R1 ;CLEAR OUT ALL 63. BYTES DUM04: MOVB #40,(R0)+ ;SPACE IT DEC R1 ;DONE? BNE DUM04 ;NO DUM05: MOV R5,R1 ;SET UP TO OUTPUT THE POSITION MOV #DUMME3,R0 ;ARGS READY JSR R5,NGNAME CMP @R2,#"ZE ;ZERO? BEQ SW.ZE CMP @R2,#"HO ;/HOOK? BEQ SW.HO CMP @R2,#"BO ;/BOOT? BEQ SW.BO CMP @R2,#"BL ;/BLOCKS:NNNNN ? BEQ SW.BL CMP @R2,#"NS ;/NS? BEQ SW.NS CMP @R2,#"FO ;FORMATTING REQUESTED? BEQ SW.FO ; ;IF MORE SWITCHES ARE NEEDED, ADD THEM HERE IN THE SAME ;MANNER AS THE ABOVE SWITCHES( DIRECT COMPARE, FOLLOWED BY ; A 'BEQ' DISPATCH). ; MOV #UNKN,R0 ;UNKNOWN SWITCH ERROR. SW.ER0: JMP ERROR1 ;ERROR ROUTINE SW.ER1: MOV #SWER,R0 ;SWITCH ERROR BR SW.ER0 SW.EHNO. OF 16 WORD BLOCKS (BITS 5 - 0) ; ENTRY FOR SYSTEM DISK: ; (MUST BE IN FIRST 1024 BLOCKS) ; WORDS 1 - 3: AS ABOVE ; WORD 4: ADDRESS OF LOCATION AFTER TABLE END ; (USED FOR SEARCH CONTROL) ;GENERATED AT SYSTEM BUILD TIME ;USED BY:- ; 1) .INIT ROUTINE TO DETERMINE WHEN & WHENCE TO ; LOAD A DRIVER REQUIRED BY THE USER ; 2) .RLSE ROUTINE TO CHECK CURRENT USAGE OF A ; RESIDENT DRIVER BEFORE RECLAIMING ; CORE IT OCCUPIES ; 3) KBD WAIT ROUTINE TO CHECK FOR I/O IKS MOV DTPAR+6,BUFSIZ ;SET UP BUFSIZ TO FOOL DFOUT JSR PC,@OUT ;DUMP THESE BLOCKS OUT DTIN6: SUB DTIBC,DTPAR+6 ;RESTORE TOTAL BLOCKS TO DUMP MOV (SP)+,BUFSIZ ;RESTORE BUFSIZ ;WE'RE OK NOW--WE'LL REPEAT TRANSFER IF HE CONTINUES. MOVB #SST,@#DT.CMD ;STOP THE TAPE THIS TIME JSR R5,INPUT ;NO--SEE IF HE WANTS TO CHANCE IT + DTEOF ;"LOGICAL END OF MEDIUM---K OR P" CMPB (R0),#'K ;WAHT'S HE WANT BEQ DTIN5 ;KILL REQUEST MOV #512.,DTIBC ;DON'T BOTHER ASKING AGAIN DTIN10: JSR PC,DTG ;READ DAJUMOUT ;DO IT .WORD 10 ;BASE EIGHT MOV #20040,DUMME3 ;SET THE FIRST TWO ZEROES TO SPACES MOV #DUMME3+10,R0 ;SET UP FOR DOING THE INSERTS OF THE STUFF MOV #10,COUNT ;SET UP A COUNTER JMP (R2) ;OFF TO THE ROUTINE ; DUM50: .WRITE #OUTLB,#DUMME6 ;TELL THE USER THAT AN EOF RECORD WAS READ DUM51: JMP NEXTCM ;AND TAKE THE NEXT COMMAND ; DUMTAB: .WORD DUM10,DUM20,DUM30,DUM40 ;RAD50, ASCII, BYTE, BINARY ; ; ; OUTPUT THE BLOCK IN RADIX-50 MODE ; DUM10: MOV R0,R1 ;MOVE THE DATA POINTER OVER DKR2: MOV #SWCNER,R0 BR SW.ER0 ; THE /ZERO,/BOOT, AND /HOOK SWITCHES TAKE NO ARGUMENTS. ; THE SWITCH WORD COUNT MUST BE 1. ; ; ; SW.ZE: BIS #ZEROSW,@R4 ;SET ZERO SWITCH. SW.ZE1: DEC @R0 ;ANY ARGS GIVEN? BNE SW.ER1 ;SWITCH ERROR SWNEXT: TST (R2)+ ;PT TO NEXT SWITCH INDICATOR MOV R2,R0 ;SET FOR NEXT SW CHECK. BR SWEV10 ;KEEP CHECKING,. ; ; SW.HO: BIS #HOOKSW,@R4 ;SET /HOOK SWITCH BR SW.ZE1 ;CHECK FOR ERROR. SW.BO: BIS #BOOTSW,@R4 BR SW.ZE1LUNDERWAY .GLOBL DDL.,DK,KB,PR,PP,LP,DT,CR,MT,DF,DC ; ;SYSTEM DISK: DDL.: .RAD50 'DK' ;NAME - PACKED 'DK ' .WORD DK ;CORE ADDRESS .WORD 220 ;I.V. ADDRESS .WORD DDL.ND ;END OF TABLE ;TELEPRINTER: .RAD50 'KB' ;NAME - PACKED 'KB ' .WORD KB ;NORMALLY NON-RESIDENT .WORD 60 ;I.V. ADDRESS .WORD 0 ;DISK ADDRESS ;P/T READER: .RAD50 'PR' ;NAME - PACKED 'PR ' .WORD PR ;NORMALLY NON-RESIDENT .WORD 70 ;I.V. ADDRESS .WORD 0 ;DISK ADDRESS MTA RTS PC ;AND RETURN DTIN2: MOV R2,-(SP) ;IT'S A NEW REEL MOV R1,-(SP) ;SAVE R2,R1,R0 FOR LATER USE MOV R0,-(SP) ; JSR PC,DTNEW ;SET UP NEW DRIVE DTIN3: JSR PC,DTG ;READ LABEL CMPB @#BUF1+1,2(SP) ;IS THIS THE RIGHT LOGICAL REEL? BEQ DTIN4 ;YES JSR R5,INPUT ;NO--SEE WHAT HE WANTS TO DO + DTWRRL ;WRONG LOGICAL REEL -- K, M, OR P CMPB (R0),#'K ;KILL REQUEST BEQ DTIN5 ;KILL REQUEST CMPB (R0),#'M ;MOUNT NEW REEL & TRY AGAIN? BEQ DTIN3 ;YES--CHECK IT'S LABEL THEN MOV #512.,@#NUM11: MOV (R3)+,R0 ;BRING THE DATA IN JSR PC,RADASC ;CONVERT IT TO ASCII MOVB RAD501,(R1)+ ;AND PUT IT IN THE BUFFER MOVB RAD502,(R1)+ MOVB RAD503,(R1)+ ADD #4,R1 ;UP TO THE NEXT PLACE FOR THE DATA JSR PC,DUM70 ;ARE WE DONE? BNE DUM11 ;NO - DO IT AGAIN ADD #20,R5 ;UP THE POSITION POINTER BR DUM60 ;YES - WRITE THIS ONE OUT ; ; ; OUTPUT THE BLOCK IN ASCII MODE ; DUM20: MOVB (R3)+,R1 ;GET A BYTE BIC #177600,R1 ;CLEAR OFF HIGH-ORDER BITS CMP R1,#40 ;IS IS PRINTABLE? BGE DUM21O SW.FO: BIS #FORMAT,@R4 BR SW.ZE1 ; ;/BLOCK SWITCH TAKES ONE ARGUMENT ; ; FORMAT: .WORD 2 ;# OF WORDS . ; .WORD ADDR ;PTS TO ASCII DIGITSS. ; .BYTE B,L ;SWITCH NAME. ; SW.BL: BIS #BLOKSW,@R4 ;SET FLAG BIT SUB #2,(R0)+ ;COUNT OK? BNE SW.ER1 ;NO..COMPLAIN. JSR PC,CONV00 ;CONVERT DEC TO BIN MOV (SP)+,BLOCKS ;RESERVE THIS MANY BLOCKS BR SWNEXT .SBTTL SW.NS -/NS SWITCH PROCESSOR. ; ;THE /NS SWITCH CAN TAKE 0,1,OR 2 ARGUMENTS ; SW.NS: BIS #P;P/T PUNCH: .RAD50 'PP' ;NAME - PACKED 'PP ' .WORD PP ;NORMALLY NON-RESIDENT .WORD 74 ;I.V. ADDRESS .WORD 0 ;DISK ADDRESS ;LINE PRINTER: .RAD50 'LP' ;NAME - PACKED 'LP ' .WORD LP ;NORMALLY NON-RESIDENT .WORD 200 ;I.V. ADDRESS .WORD 0 ;DISK ADDRESS ;DECTAPE: .RAD50 'DT' ;NAME - PACKED 'DT ' .WORD DT ;NORMALLY NON-RESIDENT .WORD 214 ;I.V. ADDRESS .WORD 0 ;DISK ADDRESS ;CARD READER: .RAD50 'CR' ;NAME - PACKED 'CR' .WORD CR ;NORMALLY NON-RESIDENT .WORD 230 ;I.V.QBUF1+2 ;PROCEED HAZARDOUTSLY---ASSUME ALL THERE DTIN4: MOV @#BUF1+2,DTIBC ;NUMBER OF BLOCKS WRITEN ON TAPE MOV (SP)+,R0 ;RESTORE R0, R1, R2 FROM STACK MOV (SP)+,R1 ; MOV (SP)+,R2 ; BR DTIN1 ;READY TO READ DATA DTIN5: JMP COMCON ;START ALL OVER AGAIN ;DECTAPE OUTPUT ROUTINE DTOUT: MOVB #DTAW,DTPAR ;FUNCTION = WRITE MOV OLB,R0 ;BLOCK TO WRITE JSR PC,LBCHK ;SEE IF FIRST BLOCK ON UNIT BEQ DTOU2 ;IT IS--DO SOME HOUSEKEEPING FIRST DTOU1: MOVB (R2),DTPAR+1 ;SET UP PHYSICAL UNIT # MOR ;YES - OK DUM22: MOV #'?,R1 ;NO - CHANGE IT TO A "?" DUM21: CMP R1,#177 ;IS IT A RUBOUT? BEQ DUM22 ;YES - CHANGE IT MOVB R1,(R0)+ ;SET IT IN THE BUFFER BIT #1,R3 ;EVEN WORD? BNE DUM20 ;NO - DO IT AGAIN ADD #5,R0 ;UP PAST 5 SPACES JSR PC,DUM70 ;DONE SIX? BNE DUM20 ;NO - DO SOME MORE ADD #20,R5 ;INCREMENT THE POSITION BR DUM60 ;AND CARRY ON ; ; ; OUTPUT IN BYTE MODE ; DUM30: MOVB (R3)+,R1 ;GET A BYTE BIC #177400,R1 ;CLEAR OUT THE HIGH BYTE FOR THE OP JSR R5,NUMOUT ;TUSNSSW,@R4 ;SET /NS FLAG IS SWFLAG DEC @R0 ;ANY ARGS GIVEN BEQ SWNEXT ;NO. GET NEXT SWITCH CMP @R0,#2 ;IF TOO MANY ARGS COMPLAIN BGT SW.ER1 BNE SW.NS2 ;2 ARGS GIVEN? TST (R0)+ ;POP TO SIZE ADDR. JSR PC,CONV00 MOV (SP)+,NS.SIZ ;SIZE OF BLOCK. SW.NS2: TST (R0)+ ;POP TO FIRST BLOCK JSR PC,CONV00 ;CONVERT DECIMAL TO BIN MOV (SP)+,NS.FB ;SET FIRST BLOCK BR SWNEXT ; CONV00: MOV (SP)+,R5 MOV @R0,-(SP) ;SET WORD TO CONVERT. MOV #2,-(SP) ;CONVERT CODE. JSR PC,CONVRT BVS CONV1T ADDRESS .WORD 0 ;DISK ADDRESS ;MAGNETIC TAPE: .RAD50 'MT' ;NAME - PACKED 'MT' .WORD MT ;NORMALLY NON-RESIDENT .WORD 224 ;I.V. ADDRESS .WORD 0 ;DISK ADDRESS ;LARGE FIXED DISK: .RAD50 'DF' ;NAME - PACKED 'DF' .WORD DF ;NORMALLY NON-RESIDENT .IIF NDF,DDCINT, .WORD 204 ;I.V. ADDRESS .IIF DF,DDCINT, .WORD DDCINT .WORD 0 ;DISK ADDRESS ;SMALL FIXED DISK: .RAD50 'DC' ;NAME - PACKED 'DC' .WORD DC ;NORMALLY NON-RESIDENT .WORD 130 ;I.V. ADDRESS .WORD 0 ;DISK ADDRESS DDL.NUV #BUF,DTPAR+4 ;CORE ADDRESS MOV R0,DTPAR+2 ;BLOCK # ON TAPE MOV OLBEND,R0 ;COMPUTE NUMBER OF BLOCKS TO READ JSR R5,ROOM1 + DTPAR+2 ;CURRENT BLOCK NUMBER + DTPAR+6 ;STORE NUMBER OF BLOCKS JSR PC,DTG ;DO IT RTS PC ;AND GO BACK DTOU2: MOV R2,-(SP) ;SAVE R2, R1, R0 MOV R1,-(SP) ;ON STACK MOV R0,-(SP) ;FOR LATERUSE JSR PC,DTNEW ;DO REEL SWITCHING AS NECESSARY CLR DTPAR+2 ;WRITE OUT ROLLIN PROGRAM ON BLOCKS 0-N MOV #BOOT,DTPAR+4 ;START OF CODE MOV #SIZBLK,DTPAR+6 ;ROLLIN SIZEVRN IT INTO A NUMBER .WORD 10 ;IN BASE EIGHT BIC #177600,R1 ;CLEAR THE HIGH BITS CMP R1,#40 ;PRINTABLE? BGE DUM31 ;YES DUM33: MOV #'?,R1 ;NO - CHANGE IT DUM31: CMP R1,#177 ;IS IT A RUBOUT? BEQ DUM33 ;IF SO, CHANGE IT MOVB #40,(R0)+ ;SET A SPACE, MOVB R1,(R0)+ ;THE CHARACTER, AND MOVB #40,(R0)+ ;ANOTHER SPACE INTO THE BUFFER OVER THE ZEROES ADD #4,R0 ;UP TO THE NEXT POSITION BIT #1,R3 ;ARE WE ON A WORD BOUNDARY? BNE DUM32 ;NO JSR PC,DUM70 ;DONE? BNE DUM30 ;NO ADD #10,W0 MOV (SP)+,@SP ;CLOBBER ADDR LEFT ON STACK. JMP @R5 ;RET TO CALLER. CONV10: MOV #ER1,R0 JMP ERROR1 .SBTTL CKCN- CHECK CONTEXT OF SWITCHES. ; ;L=LEGAL, R=REQUIRED, I= ILLEGAL, D=DEFAULT ; ; ZERO HOOK BOOT BLOCKS NS ;ZE: *** L,D L,D L I ;HO: L *** L L L ;BO: L L *** L L ;BL L L L *** L ;NS: I L L L *** ;(NONE) I ; CKCN: BIT #ZEROSW,@R4 ;/ZE SPECIFIED? BEQ CKCN10 ;NO..BRANCH. BIT #NSSW,@R4 ;YES..TEST FOR ERRORS. BNE SW.ER2 ;CONTEXT D: .END MAGNETIC TAPE: .RAD50 'MT' ;NAME - PACKED 'MT' .WORD MT ;NORMALLY NON-RESIDENT .WORD 224 ;I.V. ADDRESS .WORD 0 ;DISK ADDRESS ;LARGE FIXED DISK: .RAD50 'DF' ;NAME - PACKED 'DF' Y IN BLOCKS JSR PC,DTG ;WRITE IT OUT JSR PC,DTNEW1 ;RESET PARAMTERS JUST MESSED UP MOV #BUF1,R3 ;CLEAR OUT LABEL BUFFER DTOU3: CLR (R3)+ ;ONE WORD CMP R3,#BUF1+512. ;AT A TIME BLT DTOU3 ;UNTIL END MOV ILB,@#BUF1+4 ;DISK BLOCK CORRESPONDING TO THIS ONE MOV ILB+2,@#BUF1+6 ; MOV OLBEND,R0 ;GET LAST BLOCK # WHICH WILL BE WRITTEN JSR PC,LBCHK ;GET # MOD 512. BEQ DTOU4 ;REMAINDER = 0---NO WASTE! SUB #LB0,R0 ;LBCHK CONVERTED TO ABSOLUTE #--NO GOOD HERE MOV R1,R3 ;SAVE RESULT INC RZR5 ;YES - UP THE POSITIONAL POINTER BR DUM60 ;AND PRINT IT DUM32: DEC COUNT ;COUNT DOWN ON ODD BYTES HERE BR DUM30 ;GO FOR ANOTHER IF ON A BYTE BOUNDARY ; ; ; OUTPUT IN BINARY MODE ; DUM40: MOV (R3)+,R1 ;GET THE NUMBER JSR R5,NUMOUT ;TURN IT INTO CHARACTERS .WORD 10 ;IN BASE EIGHT ADD #7,R0 ;UP THE POINTER JSR PC,DUM70 ;DONE? BNE DUM40 ;NO ADD #20,R5 ;YES - UP THE POSITION ; ; DUM60: .WRITE #OUTLB,#DUMME4 ;WRITE THE LINE OUT BIT #77,R5 ;EXTRA LINE FEED? BNE DUM61 ;NO[ERROR. CKCN10: BIT #NSSW,@R4 ;/NS SPECIFIED? BNE CKCN20 ;YES..DON'T ASSUME /HO/BO. ; ;/NS WAS NOT SPECIFIED DEFAULT /HOOK AND /BOOT. ; CKCN15: BIS #HOOKSW!BOOTSW,@R4 ; SET /HO,BO. ; ;IF BOTH /NS AND /ZE ARE NOT SPECIFIED IT IS ILLEGAL ;TO SPECIFY THE /BLOCKS OR /FORMAT SWITCHES. ;IN THIS CASE SYSLD ASSUMES 'REPLACE' MODE AND GETS ;THE MAX CIL SIZE FROM THE CIL LINE OF THE CIL ;ALREADY ON DISK. ; CKCN20: BIT #ZEROSW!NSSW,@R4 ;/ZE OR /NS SPECIFIED? BNE CKCN80 ;YES..LISTING COMPLETE BIT \; ; TO ALLOW A SECOND DDC DISC TO REPLACE THE RF11, DEFINE THE PARAMETER ; 'DDCDAR' AS THE BUS ADDRESS OF THE CONTROLLER'S DISK ADDRESS REGISTER ; (DAR) ; ; WHEN THIS MODULE DETERMINES THE SIZE OF A DISK (DDC TYPE) IT WILL ; LOOK FOR SECTORS STARTING AT 'DDC.UP', AND INCREMENT BY ; THAT AMOUNT ON EACH ITERATION. THE ASSUMPTION IS MADE THAT THE FIRST ; NON-EXISTANT ADDRESS REACHED THIS WAY IS IN REALITY THE FIRST NON- ; EXISTANT SECTOR (I.E., THE ONE JUST BEFORE IT EXISTS) ; DDC.UP=4000 ; ;COP]1 ;R1 IS # OF REELS CMPB R3,2(SP) ;IS THIS THE LAST IN SET BEQ DTOU5 ;YES--COULD BE PARTIALLY FILLED THEN DTOU4: MOV #512.,R0 ;NO--ALL 512. BLOCKS WILL BE FILLED THEN DTOU5: MOVB R1,@#BUF1 ;# REELS IN SET MOVB 2(SP),@#BUF1+1 ;WHICH REEL THIS IS IN SET MOV R0,@#BUF1+2 ;HOW MANY BLOCK WRITTEN ON REEL TST LABEL ;ARE WE SUPPOSED TO SKIP ALL THIS? BMI DTOU6 ;YES--THEN SKIP IT JSR PC,DTG ;WRITE THE LABEL DTOU6: MOV (SP)+,R0 ;RESTORE R0 MOV (SP)+,R1 ;AND OTHERS FROM STACK MOV (SP)+,R2 ;^ .WRITE #OUTLB,#DUMME5 ;YES - DO IT DUM61: .WAIT #OUTLB ;AND WAIT FOR THE BUFFER TO BE RELEASED TST R4 ;ANY MORE TO DO? BGT DUM62 ;YES - DO IT AGAIN .WRITE #OUTLB,#DUMME5 ;WRITE ANOTHER LINE FEED OUT DEC POINT ;DO ANOTHER RECORD? BEQ DUM51 ;NO - ALL DONE JMP DUM01 ;YES - CYCLE ON THROUGH DUM62: JMP DUM03 ;GO FOR ANOTHER LINE ; ; DUM70: DEC R4 ;HOW IS THE COUNT ON THE BUFFER? BLE DUM71 ;FAR ENOUGH DEC COUNT ;NOT FAR ENOUGH RTS PC ;GO FOR MORE DUM71: TST (SP)+ ;POP THE _#BLOKSW!FORMAT,@R4 ;NO..WAS /BLOCKS SPECED? BNE SW.ER2 ;YES..CONTEXT ERROR. CKCN80: .SBTTL SET MONITOR NAME IF NONE GIVEN. ; ; IF THE FIRST WORD OF THE NAME IS 0 NO NAME ; WAS GIVEN IN THE COMMAND STRING. INSERT THE MONITOR ; DEFAULT NAME IN PLACE OF THE NULL NAME. ; IF A NAME WAS GIVEN CHECK THE EXTENSION NAME AS WELL. ; ; SETN00: MOV #OUTFIL,R1 ;FILE BLOCK. MOV #DEFNAM,R2 ;DEFAULT FILE NAME. TST @R1 ;NAME GIVEN? BNE SETN30 ;YES..CHECK EXTE`YRIGHT 1972 DIGITAL EQUIPMENT CORPORATION ;MAYNARD, MASSACHUSETTS ; ; ; THIS ROUTINE DOSES THE FOLLOWING: ; 1. DETERMINE DISK SIZE IN 256 WORD BLOCKS ; 2. SET DENSITY INDICATOR IF RK02. ; 3. IF REQUESTED VIA /FO FORMATS RK02/03/05S. ; ; ; ; .TITLE DSKSIZ .IDENT /EDIT04/ ;LAST EDIT 10-AUG-72 .SBTTL DSKSIZ - GET DISK SIZE MODULE ; ; ; ; ;DIRECT ASSIGNMENTS ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ; FORMAT =000040 ;FORMATTING REQ.FLAG. ; ; ; ;GLOBL ASSIGNMENTSaAND CONTINUE BR DTOU1 ;WITH LABLE WRITEEN ;DECTAPE CONTROLLER ASSIGNMENTS DT.CSR =177340 ;ERROR STATUS REGISTER DT.CMD =177342 ;COMMAND REGISTER DT.WC =177344 ;WORD COUNT REGISTER DT.CA =177346 ;CURRENT ADDRESS REGISTER DT.NUM =177350 ;DATA REGISTER - HOLDS BLOCK # ON SEARCH ;BITS AND PATTERNS DT.REV =4000 ;REVERSE BIT IN DT.CMD RNUM =03 ;READ BLOCK NUMBERS DTAR =05 ;READ DATA SST =011 ;STOP TRANSPORT DTAW =15 ;WRITE DATA DTG: MOV #10.,DTPAR+10 ;INITIALIZE ERROR/ROCK COUNTbRETURN ADDRESS BR DUM60 ;AND PRINT THIS ONE OUT .SBTTL *** "DIRECTORY" ; DIR90: MOV DIRCFL,R1 ;PRINT OUT TOTAL NUMBER OF FILES MOV #DIRMSS+4,R0 JSR R5,NUMOUT .WORD 12 MOV DIRCBK,R1 ;AND THE NUMBER OF BLOCKS FOUND MOV #DIRMSS+23,R0 JSR R5,NUMOUT .WORD 12 .WRITE #OUTLB,#DIRMSG DIR95: MOVB #3,SFBLK ;REWIND THE UNIT .SPEC #MTLB,#SFBLK .WAIT #MTLB MOVB (SP)+,RUNUNT ;RESET THE UNIT NUMBER JSR PC,RUN01 ;TO THE PROPER VALUE JMP NEXTCM ;GO GET ANOTHER COMMAND DIR91: BR DIR90 ;BcNSION. MOV (R2)+,(R1)+ ;NO..INSERT 3-WORD NAME. MOV (R2)+,(R1)+ SETN10: MOV (R2)+,(R1)+ SETN20: RTS PC ;EXIT. ; ; SETN30: CMP (R1)+,(R1)+ ;POP TO EXTENSIONS CMP (R2)+,(R2)+ TST @R1 ;EXTENSION GIVEN? BEQ SETN10 RTS PC ; DEFNAM: .RAD50 /MON/ .RAD50 /LIB/ .RAD50 /CIL/ ; ; .SBTTL OUTPUT DISK TABLE ; ;ENTRIES IN THIS TABLE ARE IN THE FORM: ; ;WORD0: DEVICE NAME IN RADIX 50. ;WORD1: PTR TO DEVICE BOOTSTRAP ;WORD2: PTR TO DISK SIZEd ; .GLOBL FMTERR ;ERROR WHILE FORMATTING RK. .GLOBL ERROR1 ;ERROR MSG ENTRY POINT. .GLOBL NODKER ;ASCII ERROR MESSAGES. .GLOBL RCSZ,RFSZ ;SIZE ROUTINES. .GLOBL RKSZ,RPSZ .GLOBL SWITCH .GLOBL DENIND ;HIGH/LOW RK DENSITY INDICATOR. .SBTTL DETERMINE RC DISK SIZE. .SBTTL (REALLY THE DDC DISK) ; RCDCS=165300 ;DISC CONTROL STATUS RCWC=165302 ;WORD COUNT RCCMA=165304 ;CURRENT MEMORY ADDRESS RCDAR=165306 ;DISC ADDRESS RCDER=165310 ;De DTG0: MOV #DT.CMD,R0 ;POINT TO STATUS MOV #DT.REV,R3 ;REVERSE BIT IN STATUS MOV #DT.NUM,R4 ;POINT TO DATA REGISTER FOR SEARCH MOV DTPAR,-(SP) ;UNIT # + FUNCTION MOVB #RNUM,(SP) ;FIRST THE FUNCTION IS SEARCH BIS R3,(SP) ;START SEARCHING BACKWARDS USUALLY MOV (SP)+,(R0) ;LOAD FUNCTION DTG1: BIT #100200,(R0) ;WAIT BEQ DTG1 ;WAIT SOME MORE BPL DTG2 ;DONE WAITING--NO ERROR TST -2(R0) ;ERROR--IS IT END ZONE? BPL DTG7 ;NO--THEN RETRY IT BR DTG3 ;YES--TURN TAPE AROUND DTG2: BIT RfOOT IT UP THERE ; DIR00: JSR PC,GETUNT ;GO GET A UNIT NUMBER JSR PC,DEN80 ;CHECK FOR NOTHING FOLLOWING MOVB RUNUNT,-(SP) ;SET UP THE OLD UNIT ON THE STACK MOVB R0,RUNUNT ;SET IN THE NEW UNIT JSR PC,RUN01 ;CHANGE UNITS MOVB #3,SFBLK ;DO A REWIND CLR SFBINF ;WIRH NO EXTRA INFO .SPEC #MTLB,#SFBLK ;DO IT .WAIT #MTLB ;WAIT FOR IT CLR DIRCBK ;NO TOTAL BLOCKS SO FAR CLR DIRCFL ;NO TOTAL FILES SO FAR .WRITE #OUTLB,#DIRTTL ;PUT OUT A DIRECTORY TITLE MOV #DUMME3,R2 ;CLEAR THE MOV #63g ROUTINE. ;WORD3: DEFAULT BLK SIZE IN WORDS. ;WORD4: INTERRUPT VECTOR ADDRESS. ;WORD5: INTERLEAVE FACTOR FOR INITFS. ; ; DESIZE: .WORD DPDISK-DKDISK-2 ;BYTES PER ENTRY -2 ; ; ; DKDISK: .RAD50 /DK/ ;DEVICE NAME .WORD RKSTRT ;BOOTSTRAP ADDRESS .WORD RKSZ ;ROUTINE FOR FINDING DENSITY. .WORD 256. ;BLK SIZE .WORD 220 ;INTERRUPT VECTOR .WORD 5 ;INTERLEAVE FACTOR. DPDISK: .RAD50 /DP/ .WORD RPSTRT .WORD RPSZ .WORD 256. .WORD 0 .WORD 5 ;INTERLEAVE FACTOR. DFDISK: hISC SELECT AND ERROR RCDBR=165312 ;DATA BUFFER RCMA=165314 ;MAINTENENCE RCADS=165316 ;ADDRESS OF DISC SECTOR ; ; ; THE CHECK FOR NUMBER OF SECTORS WILL PICK UP INCREMENTS OF 'DDC.UP' ; RCSZ: CLR R0 ;R5 WILL CONTAIN THE NUMBER OF MOV #400,@#RCDCS ;SECTORS AVAILABLE RCSZ10: ADD #DDC.UP,R0 ;UP IT BCS RCSZ50 ;IF A CARRY, WE JUST OVERFLOWED MOV R0,@#RCDAR ;SELECT THIS DISK ADDRESS MOV #1,@#RCDCS ;WITH A NO-OP/GO FUNCTION CMP -(SP),(SP)+ ;EXECUTE A LONG NO-OP FOR SETTLING TIME BIT #4000,@i3,(R0) ;WHICH WAY ARE WE SEARCHING? BEQ DTG5 ;FORWARD--ARE WE THERE YET? MOV DTPAR+2,R5 ;BACKWARD---FAR ENOUGH? SUB #2,R5 ;TWO BLOCKS IS ENOGUH ROOM CMP R5,(R4) ;SEE IF WE'RE THERE YET BLT DTG4 ;KEEP BACKING UP DTG3: DEC DTPAR+10 ;CHECK ROCK COUNT BEQ DTG7A ;TOO MANY ROCKS MOV R3,R5 ;XOR IN THE REVERSE BIT BIT R3,(R0) ;WHICH WAY NOW? BEQ .+4 ;FORWARD NEG R5 ;BACKWARD--SUBTRACK REVERSE BIT OUT ADD R5,(R0) DTG4: INC (R0) ;DO IT AGAIN BR DTG1 ;AND WAIT... DTG5: CMP (R4j.,R3 ;BUFFER TO SPACES DIR10: MOVB #40,(R2)+ ; DEC R3 ; BNE DIR10 ;DONE? MOVB #'.,DUMME3+10 ;SET UP THE CONSTANT CHARACTERS MOVB #'[,DUMME3+15 ; MOVB #',,DUMME3+21 ; MOVB #'],DUMME3+25 ; MOVB #'<,DUMME3+27 ; MOVB #'>,DUMME3+33 ; MOVB #'-,DUMME3+37 ; MOVB #'-,DUMME3+43 ;DONE MOVB #'7,DUMME3+44 ;NOW MOVB #'B,DUMME3+57 MOVB #'L,DUMME3+60 MOVB #'O,DUMME3+61 MOVB #'C,DUMME3+62 MOVB #'K,DUMME3+63 MOVB #'S,DUMME3+64 DIR20: .TRAN #MTLB,#MTRNBK ;READ A RECORD .WAIT #MTLB ;k .RAD50 /DF/ .WORD RFSTRT .WORD RFSZ .WORD 64. .IIF NDF,DDCINT, .WORD 204 ;INTERRUPT VECTOR .IIF DF,DDCINT, .WORD DDCINT .WORD 5 ;INTERLEAVE FACTOR. DCDISK: .RAD50 /DC/ .WORD RCSTRT .WORD RCSZ .WORD 64. .WORD 130 ;INTERRUPT VECTOR .WORD 5 ;INTERLEAVE FACTOR. ; ; ; ESCAPE: .WORD 0 ;ESCAPE WORD. .END CTOR. DPDISK: .RAD50 /DP/ .WORD RPSTRT .WORD RPSZ .WORD 256. .WORD 0 .WORD 5 ;INTERLEAVE FACTOR. DFDISK: l#RCDCS ;NON-EXISTANT DISK ADDRESS? BEQ RCSZ10 ;NOPE, CONTINUE RCSZ20: CMP R0,#DDC.UP ;ANY THERE AT ALL? BEQ NODISK ;NO - ERROR RTS PC ;YES - IS SHOULD BE THE FIRST NON-EXISTANT ;ADDRESS, SO IT IS THE NUMBER OF BLOCKS RCSZ50: MOV #177777,R0 ;IF THERE ARE 65K BLOCKS, WE MUST RTS PC ;BACK OFF BY ONE, AS DOS WILL THINK THAT ;THERE ARE ZERO BLOCKS. NODISK: MOV #NODKER,R0 ;'NON-EXISTANT DISK' MESSAGE. ECALL: JMP ERROR1 ;COMMON ERROR ENTRY PT. m),DTPAR+2 ;ARE WE AT DESIRED BLOCK? BGT DTG3 ;TOO FARR--BACK UPP BLT DTG4 ;NO FAR ENOUGH---KEEP GOING MOV DTPAR+4,-(R4) ;JUST RIGHT--SET CORE ADDRESS MOV DTPAR+6,-(SP) ;AND GET BLOCK COUNT SWAB (SP) ;WORD COUNT NEG (SP) ;NEGATIVE WORD COUNT MOV (SP)+,-(R4) ;LOAD IT MOVB DTPAR,(R0) ;LOAD TRANSFER FUNCTION DTG6: BIT #100200,(R0) ;NOW WAIT FOR TRANSFER BEQ DTG6 ;STILL WAITING BMI DTG7 ;ERROR ON XFER--TRY AGAIN BIS R3,(R0) ;LEAVE TAPE GOING IN REVERSE MOVB #RNUM,(R0) ;FOR AUTOMnWAIT FOR IT CMP TRNWC,BUFSIZ ;EOF READ? BEQ DIR91 ;YES - ALL DONE ADD #7,TRNWC ;IS THE RECORD EXACTLY SEVEN WORDS? CMP TRNWC,BUFSIZ ;I.E., STANDARD DOS FILE LABEL? BEQ DIR25 ;YES - PUT IT OUT .WRITE #OUTLB,#DIRERM ;NO - TELL THE USER DIR25: CLR R1 ADD #16,BUFADR ;SAVE THE LABEL SUB #7,BUFSIZ ;BY ADJUSTING THE PARAMETERS DIR48: .TRAN #MTLB,#MTRNBK ;READ TO THE END OF THE FILE .WAIT #MTLB CMP TRNWC,BUFSIZ ;EOF? BEQ DIR49 ;NO INC R1 ;NO - UP THE COUNT BR DIR48 ;KEEP ON GOING .RAD50 /DF/ .WORD RFSTRT .WORD RFSZ .WORD 64. .WORD 204 ;INTERRUPT VECTOR .WORD 5 ;INTERLEAVE FACTOR. DCDISK: .RAD50 /DC/ .WORD RCSTRT .WORD RCSZ .WORD 64. .WORD 210 ;INTERRUPT VECTOR .WORD 5 ;INTERLEAVE FACTOR. ; ; ; ESCAPE: .WORD 0 ;ESCAPE WORD. p .SBTTL DETERMINE RF SIZE .IF DF,DDCDAR .SBTTL (REALLY SECOND DDC DISK) ; THE CHECK FOR NUMBER OF SECTORS WILL PICK UP INCREMENTS OF 'DDC.UP' ; RFSZ: CLR R0 ;R5 WILL CONTAIN THE NUMBER OF MOV #400,@#DDCDAR-6 ;SECTORS AVAILABLE RFSZ10: ADD #DDC.UP,R0 ;UP IT BCS RCSZ50 ;IF A CARRY, WE JUST OVERFLOWED MOV R0,@#DDCDAR ;SELECT THIS DISK ADDRESS MOV #1,@#DDCDAR-6 ;WITH A NO-OP/GO FUNCTION CMP -(SP),(SP)+ ;EXECUTE A LONG NO-OP FOR SETTLING TIME BIT #4000,@#DDCDAR-6 ;NON-EXISTANT DISK ADDREqATIC UNLOAD RTS PC ;AND RETURN DTG7: DEC DTPAR+10 ;ERROR COUNT =0 BNE DTG0 ;STILL ROOM TO RECOVER DTG7A: MOVB #SST,(R0)+ ;GENERATE A NICE MESSAGE MOVB (R0),R2 ;GET UNIT # BIC #-7-1,R2 ;JUST UNIT # ADD #60,R2 ;ASCII UNIT # MOVB R2,DTOKU ;PUT IN STRING JSR R5,INPUT ;TYPE IT OUT + DTOK CMPB (R0),#'K BNE DTG ;NOT KILL- THEN TRY AGAIN JMP COMCON ;QUIT ;REEL SWTICHER ;EVERY TIME WE GO FROM ONE LOGICAL UNIT TO ANOTHER, ;WE CHECK TO SEE IF IT IS ON SAME DRIVE. ;IF IT IS, THEN r DIR49: SUB #16,BUFADR ;RE-ADJUST THE PARAMETERS ADD #7,BUFSIZ ;TO THE ORIGINAL VALUES .WAIT #OUTLB ;AND WAIT FOR THE TTY TO COME READY MOV BUFADR,R2 ;ADDRESS OF THE RECORD READ IS IN R2 NOW .RADUP #DUMME3+2,(R2)+ ;UNPACK THE FILE NAME .RADUP #DUMME3+5,(R2)+ ;BOTH WORDS .RADUP #DUMME3+11,(R2)+ ;UNPACK THE EXTENSION MOV #DUMME3+16,R3 ;SET UP TO GET THE PROJ NUMBER INC R2 ;REVERSE THE ORDER OF THE BYTES JSR PC,DIR50 ;DO IT INC R3 ;UP TO THE NEXT SPOT SUB #2,R2 ;CONTINUE REVERSING Ts; ; THIS IS CONDITIONIALIZED TO BECOME EITHER THE STANDARD DEC RF11 ; DRIVER, OR ELSE THE DRIVER FOR THE SECOND DDC DISK. TO MAKE IT THE ; ONE FOR THE SECOND DDC DISK, DEFINE THE PARAMETER 'DDCDAR' AS ; THE BUS ADDRESS FOR THE CONTROLLER'S DISK ADDRESS REGISTER (DAR) ; ; (THE DEVICE 'DC' IS ALREADY SET UP AS THE FIRST DDC DISK) ; ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V04 .TITLE DV.DF ;DISK DRIVER (RF11) VERSION 1 ; RESIDENT MONITOR ROUTINE FOR SYSTEM UStSS? BEQ RFSZ10 ;NOPE, CONTINUE BR RCSZ20 ;NOW GO COMMON WITH FIRST DDC DISC CODE ; .IFF ; ;UP TO EIGHT RS11 DISKS CAN CONTROLLED BY RF11 CONTROLLER. ;EACH PLATTER CONTAINS: ; 1024. 256. WORD BLOCKS ; OR ; 4096. 64.WORD BLOCKS ; ; ; RFDCS=177460 ;DISK CONTROL STATUS RFWC =177462 ;WORD COUNT RFCMA=177464 ;CURRENT MEMORY ADDRESS RFDAR=177466 ;DISK ADDRESS RFDAE=177470 ;DISK ADDRESS EXTENSION ERROR RFDDB=177472 ;DISK DATA BUFFER RFADS=177476 ;ADDRESS OF DISK SEGMENT. ; uWE GIVE OPERATOR A CHANCE TO MOUNT NEW REEL ;R2 POINTS TO ENTRY IN DTABL ON ENTRY DTNEW: TSTB (R2) ;HAVE WE REACHED UNSPECIFIED DRIVE? BMI DTNEW2 ;YES--COMPLAIN MOVB (R2),DTPAR+1 ;SET UP NEW UNIT # IN PARAMETERS CMPB -1(R2),(R2) ;IS THIS SAME UNIT AS OTHER BNE DTNEW1 ;NO--ASSUME IT IS SET UP MOVB (R2),DTPAR+1 ;SET UNIT # IN PARAMETERS MOVB (R2),-(SP) ;SET UP OUTOUT MESSAGEE ADD #'0,(SP) ;CONVERT TO ASCII MOVB (SP)+,DTMTUN ;STORE IN OUTPUT STRING JSR R5,INPUT ;GIVE HIM THE NEWS +vHE BYTE ORDER JSR PC,DIR50 ;AGAIN FOR THE PROG NUMBER INC R2 ;BACK TO NORMAL ON THE BYTES ADD #3,R3 ;UP TO THE SPOT FOR THE JSR PC,DIR50 ;PROTECTION CODE TSTB (R2)+ MOV (R2)+,R5 ;DATE IS NOW IN R5 MOVB #'0,DUMME3+45 ;SET UP DIR30: SUB #1000.,R5 ;FIND OUT WHICH YEAR - GOOD ONLY UNTIL BMI DIR35 ;THE YEAR 1979 - BAD ON 01-JAN-80 INCB DUMME3+45 ;UP TO THE NEXT YEAR BR DIR30 ; DIR35: ADD #1000.,R5 ;DONE CLR R4 ;FIND OUT THE MONTH SUB #31.,R5 ;THIS THE MONTH? BLE DIR41 ;YES - wAGE ; CONTAINS SET UP & TRANSFER ROUTINES ONLY R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL DF ;TABLE OF STANDARDS AND POINTERS DF: .WORD 0 ;CURRENT DDB ADDRESS (0 IF IDLE) DFFLGS: .BYTE 37 ;STANDARD FACILITY INDICATOR .BYTE 200 ;(NORMAL & FILE-BASED) .BYTE 4 ;STANDARD BUFFER SIZE/16 .BYTE DF.INT-DF ;T.V. CONTENT .BYTE 240 ;PRIORITY FOR T.V. .BYTE 0 ;DESPATCH TABLE .BYTE DF.TFR-DF ;SHOWS TFR RTN ONLY .BYTE 0 .BYTE 0 .BYTE 0 ;SPARE DF.NAM: .RAD50 'DF' .Wx; RFSZ: CLR R5 ;SET PLATTER COUNT. MOV #400,@#RFDCS ;ENSURE DISK CLEAR. RFSZ10: MOV R5,@#RFDAE ;REFERENCE THIS DISK# BIT #4000,@#RFDCS ;IS DISK THERE? BNE RFSZ20 ;NO..DISK NOT THERE. CMP (R5)+,(R5)+ ;ADD 1 TO UNIT# BR RFSZ10 ;TRY AGAIN. ; ;THE NON-EXISTANT DISK CONDITION IS IN EFFECT. ;IF R5 IS 0 THERE ARE NO PLATTERS. ; RFSZ20: ASR R5 ;GET PLATTER COUNT. ASR R5 MOV R5,R3 ;SET COUNT FOR LOOP. MOV #4096.,R1 ;# OF DOSS-SIZED WORD BLKS. RFSZ25: CLR R0 ;INIT BLOCK COUNT TST R5 y DTMONT ;MOUNT REEL ON DT'X'; TYPE ANY CHAR WHEN READY DTNEW1: MOV #LABLK,DTPAR+2 ;SET UP LABEL BLOCK # MOV #BUF1,DTPAR+4 ;CORE ADDRESS MOV #1,DTPAR+6 ;JUST ONE BLOCK RTS PC DTNEW2: JSR R5,MES ;REPORT PROBLEM + NOMORE ;EXHAUSETED DTA SPECIFICATIONS XCOMC: JMP COMCON ;NEW REQUEST ;LOGICAL BLOCK CHECKER ;CONVERTS A LOGICAL BLOCK IN DTA SET TO REEL # AND BLOCK IN REEL ;EACH REEL HAS 512. LOGICAL BLOCKS ;ON EXIT, R2 POINTS TO PHYSCIAL UNIT IN DTABL, R0 HAS BLOCK #, ;AND Z =1 IF FIRSTzDO IT INC R4 ;NO CMPB #'2,DUMME3+45 ;LEAP YEAR? BEQ DIR34 ;YES CMPB #'6,DUMME3+45 ;STILL? BNE DIR36 ;NO DIR34: SUB #29.,R5 ; BLE DIR39 BR DIR37 DIR36: SUB #28.,R5 BLE DIR38 DIR37: INC R4 SUB #31.,R5 BLE DIR41 INC R4 SUB #30.,R5 BLE DIR40 INC R4 SUB #31.,R5 BLE DIR41 INC R4 SUB #30.,R5 BLE DIR40 INC R4 SUB #31.,R5 ;JULY BLE DIR41 INC R4 SUB #31.,R5 BLE DIR41 INC R4 SUB #30.,R5 BLE DIR40 INC R4 SUB #31.,R5 BLE DIR41 INC R4 SUB #31.,R5{ORD DF.DIR ;MFD BLOCK .WORD 0 ;REQUIRED FOR BIT MAP INFO ;TRANSFER INITIATE DF.TFR: MOV @PC,DF.RTC ;ZERO RETRY COUNT .IF NDF,DDCDAR DF.RPT: MOVB @PC,@#DF.DCS+1 ;CLEAR DISK IN CASE OF ERROR MOV DF,R0 ;GET DDB ADDRESS CMP (R0)+,(R0)+ ;BUMP POINTER TO BLOCK NO. MOV #DF.DCS+12,R2 ;SET HWR POINTER MOVB @PC,R3 ;SET UP BLOCK CONVERSION MOV (R0)+,R4 ;GET BLOCK NUMBER (******) ASL R4 ;CONVERT TO WORDS ROLB R3 BCC .-4 MOV R3,-(R2) ;SET UP DISK | ;ANY RF DISKS? BEQ NODISK ;NO - ERROR RFSZ30: ADD R1,R0 ;YES - COUNT THE NUMBER OF BLOCKS DEC R3 BNE RFSZ30 RTS PC ;RETURN WITH R0=NUMBER OF BLOCKS .ENDC .SBTTL DETERMINE RK DENSITY ; ;THE DECPACK IS AVAILABLE IN TWO MODELS: ; RK02= 600,000 WORDS PER DRIVE ; RK03=1,200,000 WORDS PER DRIVE ; RKDS=177400 ;DRIVE STATUS REGISTER RKER=177402 ;ERROR REGISTER RKCS=177404 ;CONTROL STATUS REGISTER RKWC=177406 ;WORD COUNT REGISTER RKBA=177410 } LOGICAL BLOCK ON REEL LBCHK: CLR R1 ;REEL COUNTER =0 LBCH1: CMP R0,#512. ;REACHED RIGHT REEL? BLT LBCH2 ;YES SUB #512.,R0 ;NOT YET INC R1 ;NOTE BR LBCH1 ;CONITINUE LBCH2: MOV R0,-(SP) ;SAVE LOGCAL BLOCK MOD 512. ADD #LB0,R0 ;CONVERT TO ABSOLUTE BLOCK IN TAPE MOV R1,R2 ; ADD #DTABL,R2 ; LBCH3: TST (SP)+ ;SET CC'S ON LOGICAL BLOCK # RTS PC ;AND EXIT ;MAGTAPE ROUTINES.... ;INPUT FROM MAGTAPE MTIN: JSR PC,MTRWSK ;PERFORM REWIND AND SKIP IF NEEDED MOV #MTRD,DTPAR ;FUNC~ BLE DIR41 INC R4 SUB #31.,R5 BLE DIR41 INC R4 CLR R5 BR DIR45 DIR38: ADD #28.,R5 BR DIR45 DIR39: ADD #29.,R5 BR DIR45 DIR40: ADD #30.,R5 BR DIR45 DIR41: ADD #31.,R5 DIR45: MOV R4,R2 ADD R4,R2 ADD R4,R2 MOVB MONTHS(R2),DUMME3+40 ;SET THE MONTH IN MOVB MONTHS+1(R2),DUMME3+41 MOVB MONTHS+2(R2),DUMME3+42 MOVB #'0,DUMME3+35 DIR46: SUB #10.,R5 BLT DIR47 INCB DUMME3+35 BR DIR46 DIR47: ADD #10.+60,R5 MOVB R5,DUMME3+36 MOV #DUMME3+50,R0 ADD R1,DIRCBK ;ADD THIS TOADDRESS & EXT. MOV R4,-(R2) MOV (R0)+,-(R2) ;MOVE IN WORD COUNT ... MOV (R0)+,-(R2) ;& MEMORY ADDRESS .IFF DF.RPT: MOV #400,@#DF.DCS ;CLEAR DISK IN CASE OF ERROR MOV DF,R0 ;GET DDB ADDRESS CMP (R0)+,(R0)+ ;BUMP POINTER TO BLOCK NO. MOV #DF.DCS+10,R2 ;SET HWR POINTER MOV (R0),-(R2) ;SET BLOCK NUMBER AS SECTOR NUMBER MOV (R0)+,@#177570 ;DISPLAY IN DATA LIGHTS MOV (R0)+,-(R2) ;SET MEMORY ADDRESS MOV (R0),NOT4 BIC #177774,NOT4 ;IS THE WORD COUNT A MULTIPLE OF FOUR? BEQ SETWC ;YES ;CURRENT BUS REGISTER RKDA=177412 ;DISK ADDRESS REGISTER RKDB=177416 ;DATA BUFFER REGISTER ; ; ;AT ENTRY R0 MUST CONTAIN THE ARGUMENT UNIT#IN BITS (15-13). ;AT EXIT R0=NUMBER OF BLOCKS AVAILABLE. ; ;CAILING SEQ: ; MOV UNITNO,R0 ;SET UNIT #(BITS 15-13) ; JSR PC,RKSZ ;DETERMINE RK DENSITY ; ;AT RET, R0=BLK CNT. ; ; RKSZ: MOV R0,R5 ;SAVE ARG UNIT NO. MOV R0,@#RKDA ;SELECT ARGUMENT UNIT. BIT #200,@#RKDS ;NON EXISTANT DISK? BNE RKSZ10 ;DISK IS THERE. JMP NODISK ;NO ITS NOT..COMPLTION IS READ TST MTRWD ;CHECK FOR LABEL CHECKING TIME BEQ MTIN1 ;GO DO LABEL CHECKING MTIN3: MOV #BUF,DTPAR+4 ;SET UP TRANSFER ADDR MOV ILBEND,R0 ;LAST BLOCK TO READ MOV ILBEND+2,R1 ; JSR R5,ROOM ;COMPUTER NUMBER OF BLOCKS TO READ + ILB ;CURRENT INPUT BLOCK + DTPAR+6 ;NUMBER OF BLOCKS STORED HERE JSR PC,MTGO ;PERFORM READ RTS PC MTIN0: JSR PC,MTRW3 ;SKIP TO EOF MTIN1: MOV #BUF1,DTPAR+4 ;LABEL CHECKING MOV #-LBLSIZ,DTPAR+6;JUST READ LABEL BLOCK MOV MTAS,-(SP) ;SAVE BOT FLAG THE TOTAL BLOCKS JSR R5,NUMOUT .WORD 12 .WRITE #OUTLB,#DUMME4 ;WRITE THE LINE OUT INC DIRCFL ;COUNT THE FILE JMP DIR20 DIR50: MOVB (R2)+,R5 ROL R5 ROL R5 MOV R5,R4 SWAB R4 BIC #177774,R4 ADD #60,R4 MOVB R4,(R3)+ JSR PC,DIR55 JSR PC,DIR55 RTS PC DIR55: ROL R5 ROL R5 ROL R5 MOV R5,R4 SWAB R4 BIC #177770,R4 ADD #60,R4 MOVB R4,(R3)+ RTS PC ; MONTHS: .ASCII 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC???' .EVEN ; .SBTTL *** "NEWDIR", "FFIND", AND "FIND" ; NE- ALL IS WELL MOV (R0),R5 ;NO - SAVE THE THREE WORDS NEG R5 ;AFTER THE END OF THE TRANSFER ASL R5 ;MAKE IT BYTE COUNT POSITIVE ADD (R2),R5 ;FOR A LATER RESTORE MOV R5,SAVEAD ;SAVE THE ADDRESS MOV (R5)+,SAVE1 ;***** NOTE: THIS COULD CAUSE PROBLEMS MOV (R5)+,SAVE2 ;***** IF A .TRAN BUFFER WAS IMMEDIATELY MOV (R5),SAVE3 ;***** FOLLOWED BY VARIABLE STOREAGE THAT ;***** CHANGED DURING THE TRANSFER! ;***** (BUT ONLY IF (WC&3).NE.0) SETWC: MOV (R0)+,-(R2) ;MOVE IN WORD COUNT BIC AIN. RKSZ10: MOV #4800.,R2 ;ASSUME HIGH DENSITY BIT #4000,@#RKDS ;HIGH DENSITY DRIVE? BNE RKSZ20 ;YES..BLK CNT ALL SET. ASR R2 ;NO...HALF BLOCK COUNT. MOV #1,R3 ;ASSUME UNIT #0 IS LOW DENS. MOV R0,R4 ;UNIT # BITS 15-13 RKSZ12: BEQ RKSZ14 ;UNIT FOUND,SET INDICATOR. ASL R3 ;NOT FOUND SHIFT FOR NEXT. SUB #20000,R4 ;UNIT #=UNIT #-1 BR RKSZ12 ;ARGUMENT UNIT #. RKSZ14: BISB R3,DENIND ;SET FLAG IN RK DRIVER. .SBTTL RK DISK FORMATTING ROUTINE.  JSR PC,MTGO ;READ LABEL MOV #BUF1,R0 CMP (R0)+,MTNAM0 ;VERIFY FILE NAME BNE MTIN9 CMP (R0)+,MTNAM1 BNE MTIN9 CMP (R0)+,(PC)+ ;CHECK EXTENSION .RAD50 /ROL/ ;REQUIRED EXTENSION BNE MTIN9 MTIN8: BIT #MTBOT,(SP)+ ;ARE WE AT BOT? BEQ MTIN7 ;NO... MOV #MTABRC,R0 ;NOW PERFORM SKIP MOV #-2,(R0) ;THATS TWO RECORDS TO SKIP TST -(R0) MT.CMD MTSF+1 ;EXECUTE SKIP FUNCTION TSTB (R0) BPL .-2 TST (R0) ;CHECK FOR ERROR BMI MTFTL ;IF ERROR ITS FATAL MTIN7: CLR DTPAR+6 ;READ ROLLW00: JSR PC,GETUNT ;GET THE UNIT NUMBER JSR PC,DEN80 ;CHECK THE SYNTAX MOVB RUNUNT,-(SP) ;SAVE THE OLD UNIT NUMBER MOVB R0,RUNUNT ;SET THE NEW ONE JSR PC,RUN01 ;CHANGE UNITS MOVB #3,SFBLK ;REWIND .SPEC #MTLB,#SFBLK ;THE UNIT .WAIT #MTLB ; MOVB #2,SFBLK ;WRITE EOF CLR SFBINF .SPEC #MTLB,#SFBLK ;ONCE .SPEC #MTLB,#SFBLK ;TWICE AND WE HAVE A NEW DIRECTORY JMP DIR95 ;GO REWIND THE TAPE AND CHANGE UNITS BACK ; ; ; FIN00: MOVB #3,SFBLK ;DO A REWIND .SPEC #MTLB,#SFBLK ;ON THE DRIVE#3,(R2) ;AND BE CERTAIN THAT IT IS OK .ENDC MOV (R0)+,R1 ;GET FUNCTION BISB @PC,R1 ;ADD INT ENB & GO BIC #177470,R1 ;REMOVE OTHER GARBAGE (******) MOV R1,-(R2) ;SEND TO CONTROL RTS PC ;RETURN TO MONITOR FOR NOW ;(******) - CARE!!!! USED AS LITERAL BY PREVIOUS INSTRUCTION ;INTERRUPT SERVICE DF.INT: MOV @#V.RSAV,-(SP) JSR R5,@(SP)+ .IF DF,DDCDAR MOV NOT4,R5 ;WAS THE TRANSFER A MULTIPLE OF FOUR WDS? BEQ GONE ;YES - ALL IS WELL, LEAVE MOV ; ; DETERMINE IF THIS RK DISK NEEDS TO BE FORMATTED. ; RKSZ20: MOV R2,R0 ;SET RETURN ARG. MOV R5,R1 ;SET ARGUMENT UNIT #. BIT #FORMAT,SWITCH ;FORMATTING REQUESTED? BEQ RKSZ60 ;NO..EXIT TO USER. ; ; FORMAT THE RK DISK. ; MOV #RKCS,R2 ;CONTROL STATUS ADDR. MOV #1,@R2 ;RESET CONTROLLER. RKSZ25: TSTB @R2 ;CONTROLLER READY? BPL RKSZ25 ;NO..KEEP WAITING. MOV R1,@#RKDA ;SELECT ARG DISK. RKSZ30: MOV #RKBA,R3 ;BUS ADDRESS. CLR @R3 MOV #-1,-(R3) ;WORD COUNT. MOV #2003,-(R3) ;CONTROIN LABEL JSR PC,MTGO ;DO READ CMP MTREEL,BUF1 ;CHECK REEL NUMBER BNE MTIN2 MTIN4: INC MTREEL ;FOR NEXT REEL IF NEEDED MOV #-1,MTRWD ;SET FLAG BACK TO NORMAL CLR MTFIND ;CLEAR FIND FLAG BR MTIN3 MTIN9: TST (SP)+ ;FLUSH BOT FLAG OFF STACK TST MTFIND ;ARE WE LICENSED TO FIND FILE? BNE MTIN0 ;YES... JSR PC,BKSP ;RESET TAPE POSITION JSR R5,MES ;BAD FILE NAME.. + BFN MTINX: BR XCOMC ;ABORT MTIN2: JSR R5,INPUT ;LABEL CHECK ERROR + DTWRRL CMPB (R0),#'P ;PROCEED ANYWAY?  ; ;NOW THE CODE IS THE SAME AS FOR "FFIND" ; FFI00: MOV #FINFIL,R0 ;GO MAKE THE FILE NAME JSR PC,MAKNAM ;FROM WHAT WAS TYPED IN BR FIN99 ;ERROR - ABORT JSR PC,GETC ;GET THE NEXT CHARACTER JSR PC,DEN80 ;CHECK THE SYNTAX OUT FIN10: .TRAN #MTLB,#MTRNBK ;READ A RECORD .WAIT #MTLB ;WAIT FOR IT CMP BUFSIZ,TRNWC ;EOF READ? BEQ FIN80 ;YES - NOT FOUND MOV BUFADR,R2 ;SET UP THE BUFFER ADDRESS CMP FINFIL,(R2)+ ;DOES THE FILE NAME MATCH? BNE FIN20 ;NO - GO GET THE NEXT CMP FINFIL+2,SAVEAD,R0 ;SET UP TO MOVE MOV SAVE1,(R0)+ ;AND MOVE THEM DEC R5 ;BUT ONLY WHAT IS NEEDED BEQ GONE MOV SAVE2,(R0)+ DEC R5 BEQ GONE MOV SAVE3,(R0) GONE: MOV #DDCDAR-6,R1 ;ERROR CAUSE INTERRUPT? .IFF MOV #DF.DCS,R1 ;ERROR CAUSE INTERRUPT? .ENDC MOV (R1)+,R2 BMI DF.ERR ;YES - GO FIND CAUSE MOV DF,R0 ;GET DDB ADDRESS DF.XIT: MOV 14(R0),PC ;RETURN MONITOR ;ERROR ROUTINE: DF.ERR: BIT #11000,R2 ;PARITY OR MISSED? BEQ DF.OFF DF.AGN: ASL #0 ;YES - RETRIED 8 TIMES? DF.RTC=.-2 L STATUS.GO!FORMAT!WRITE RKSZ40: BIT #100200,@R3 ;ERROR OR CONTROL READY? BEQ RKSZ40 ;NO DONE YET,KEEP LOOPING. BPL RKSZ30 ;TRY AGAIN ; ; ERROR MUST BE NON EXISTANT CYLINDER. ; OTHERWISE ITS A HARDWARE ERROR(FATAL). ; BIT #100,-(R3) BEQ RKSZ90 ;DISK ERROR DURING FORMATTING. RKSZ50: MOV #1,@R2 ;RESET CONTROLLER AGAIN RKSZ55: TSTB @R2 ;WAIT FOR CONTROLLER. BPL RKSZ55 RKSZ60: RTS PC ; RKSZ90: MOV #FMTERR,R0 ;HARDWARE ERROR WHILE FORMATTING. BR ECALL .END O!FORMAT!WRITE RKSZ40:BEQ MTIN4 ;BR IF P MTIN6: CMPB (R0),#'M ;MOUNT A NEW REEL? BEQ MTIN5 ;BR IF M MABORT: JMP COMCON ;ELSE KILL REQUEST MTIN5: JSR R5,INPUT ;WAIT FOR TAPE TO BE MOUNTED + MTMONT INC MTRWD ;FORCE REWIND BR MTIN ;AND TRY AGAIN MTFTL: JMP MTRWF ;FATAL ERROR BRANCH ;OUTPUT TO MAGTAPE MTOUT0: JSR R5,MES ;WRITE LOCK ERROR + ERRMWL JSR R5,INPUT + ERRMX ;TRY AGAIN? CMPB (R0),#'K ;DOES HE WANT TO ABORT BEQ MABORT ;YES MTOUT: BIT #MTWRL,MTAS ;CHECK FOR SELECT ERRORS BNE MTOU(R2)+ ;SECOND PART MATCH? BNE FIN20 ;NO CMP FINFIL+4,(R2)+ ;EXTENSION MATCH? BEQ FIN30 ;YES - WE FOUND IT FIN20: .TRAN #MTLB,#MTRNBK ;READ TO THE END OF THE CURRENT FILE .WAIT #MTLB ;WAIT FOR IT CMP BUFSIZ,TRNWC ;EOF? BNE FIN20 ;NO - KEEP MOVING BR FIN10 ;YES - LOOK AT THE FILE LABEL NEXT FIN30: MOV #FINMSS,R3 ;FOUND THE FILE - PRINT OUT THE UIC INC R2 ;REVERSE THE BYTE ORDER JSR PC,DIR50 ;PROG NUMBER OUTPUT SUB #2,R2 ;CONTINUE THE BYTE REORDERING INC R3 ;PAST THE COMMA JBCS DF.PER ;IF SO FORCE CONTINUE JSR PC,DF.RPT ;OTHERWISE TRY AGAIN DF.REC: MOV @#V.XIT,R5 JMP 4(R5) DF.PER: BIS #100000,12(R0) ;RETURN PARITY FAIL FLAG .IF DF,DDCDAR BR DF.XIT ;AND TAKE THE EXIT FOR COMPLETION .IFF TST @R1 ;ALREADY AT BLOCK END? BEQ DF.XIT ;IF SO EXIT NOW TST DF.RTC ;OTHERWISE CHECK IF 2ND TIME BEQ DF.OFF ;IF SO NO POINT IN MORE INC -(R1) ;CONTINUE DISK TRANSFER BR DF.REC ;... VIA COMMON EXIT .ENDC ;ERROR IS NOT IMMEDIATELY RECOVERABLE: DF.OFF: CLR DF BIT #100200,@R3 ;ERROR OR CONTROL READY? BEQ RKSZ40 ;NO DONE YET,KEEP LOOPING. BPL RKSZ30 ;TRY AGAIN ; ; ERROR MUST BE NON EXISTANT CYLINDER. ; OTHERWISE ITS A HARDWARE ERROR(FATAL). ; BIT #100,-(R3) BEQ RKSZ90 ;DISK ERROR DURING FORMATTING. RKSZ50: MOV #1,@R2 ;RESET CONTROLLER AGAIN T0 ;BRANCH IF WRITE LOCK TST MTFIND ;CHECK FOR FORCE END-OF-TAPE BEQ MTOUTA ;NO.. CLR MTFIND ;ONCE ONLY PLEASE MOV #-1,MTSKIP ;SKIP ALL FILES ON TAPE MTOUTA: JSR PC,MTRWSK ;PERFORM REWIND AND SKIP IF NEEDED MOV #MTWT,DTPAR TST MTRWD ;CHECK FOR LABEL WRITING BEQ MTOUT1 ;GO TO LABEL WRITE ROUTINE MTOUT3: MOV #BUF,DTPAR+4 ;LOAD BUFFER ADDRESS MOV OLBEND,R0 ;LAST BLOCK TO WRITE MOV OLBEND+2,R1 ; JSR R5,ROOM ;COMPUTE NUMBER OF BLOCKS TO WRITE + OLB ;CURRENT OUTPUT BLOCK + DTPASR PC,DIR50 ;PROG NUMBER OUT .WRITE #CMOLB,#FINMSG ;TELL THE USER JSR R5,ECHO .WORD FINMSG BR FIN85 ;AND GET ANOTHER COMMAND FIN80: .WRITE #CMOLB,#FINNOF ;TELL THE USER THAT THE FILE WAS NOT FOUND JSR R5,ECHO .WORD FINNOF FIN85: JMP NEXTCM ;AND GET ANOTHER COMMAND FIN99: JMP ILLCOM ;ILLEGAL COMMAND SYNTAX - TELL USER .WORD 0,0 ;DUMMIES FOR USE AS A FILE BLOCK FINFIL: .BLKW 3 ;RESERVE THREE WORDS FOR MAKING THE FILE NAME .WORD 0,0 ;MORE FFILE BLOCK STUFF .SBTTL *** "TO" ; TO0 ;FREE DISK FOR EDP MOV -(R1),-(SP) ;DISK STATUS IS EVIDENCE MOV #DF.ENO,-(SP) ;SET UP ERROR NO. BIT #SDRVR,DFFLGS ;SYSTEM DRIVER? BEQ DF.SND ;NO - BRANCH CLR @SP ;CODE TO FORCE A HALT DF.SND: IOT ;GO TO DIAG. PRT. ; .IF DF,DDCDAR SAVEAD: 0 ;SAVE LOCATIONS IN CASE OF NOT TRANSFERRING A MULTIPLE SAVE1: 0 ;OF FOUR WORDS (UNUSED OTHERWISE) SAVE2: 0 SAVE3: 0 NOT4: 0 ;FLAG INDICATION A NOT MULT OF 4 XFER (IF NON-ZERO) .ENDC ; ;DEFINITIONS: DF.DCS=177460 DF.DIR=1 DF.ENO=1426 V.XIT; ; THIS IS CONDITIONIALIZED TO BECOME EITHER THE STANDARD DEC RF11 ; DRIVER, OR ELSE THE DRIVER FOR THE SECOND DDC DISK. TO MAKE IT THE ; ONE FOR THE SECOND DDC DISK, DEFINE THE PARAMETER 'DDCDAR' AS ; THE BUS ADDRESS FOR THE CONTROLLER'S DISK ADDRESS REGISTER (DAR) ; ; (THE DEVICE 'DC' IS ALREADY SET UP AS THE FIRST DDC DISK) ; ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V04 .TITLE DV.DF ;DISK DRIVER (RF11) VERSION 1 ; RESIDENT MONITOR ROUTINE FOR SYSTEM USR+6 ;NUMBER OF BLOCKS JSR PC,MTGO ;PERFORM WRITE RTS PC MTOUT1: MOV #BUF1,R0 MOV R0,DTPAR+4 ;BUFFER ADDRESS FOR WRITE MOV MTAS,-(SP) ;SAVE BOT FLAG MOV #MTNAM0,R1 MOV (R1)+,(R0)+ ;STORE FIRST WORD OF NAME BNE MTOUT6 ;NAME MUST BE SPECIFIED... JSR R5,MES ;NO NAME SPECIFIED + NFN BR MTINX ;ABORT MTOUT6: MOV (R1)+,(R0)+ MOV (PC)+,(R0)+ ;EXTENSION .ROL ALWAYS.. .RAD50 /ROL/ MOV #401,(R0)+ ;UIC = 1,1 MOV #233,(R0)+ ;PROTECTION = 233 MOV (R1)+,(R0)+ ;DATE WORD CLR (R0) ;0: JSR PC,TOFRM0 ;GO GET THE DEVICE NAME AND SET UP BR TO50 ;MAGTAPE COPY - DO IT TO10: .TRAN #MTLB,#MTRNBK ;READ A RECORD .WAIT #MTLB ;WAIT FOR IT CMP BUFSIZ,TRNWC ;EOF READ? BEQ TO90 ;YES - ALL DONE MOV BUFADR,R2 ;NO - PICK UP THE FILE NAME MOV (R2)+,FINFIL ;AND PUT IT IN THE FILE BLOCK MOV (R2)+,FINFIL+2 MOV (R2)+,FINFIL+4 ;DONE MOVB 2(R2),FINFIL+10 ;SET IN THE PROTECTION CODE MOV #2,FINFIL-2 ;SET UP THE HOW OPEN CODE TO OUTPUT .OPENO #TOFRLB,#FINFIL ;OPEN UP THE FILE TO20: .=42 V.RSAV=44 SDRVR=10000 .END AGE ; CONTAINS SET UP & TRANSFER ROUTINES ONLY R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL DF ;TABLE OF STANDARDS AND POINTERS DF: .WORD 0 ;CURRENT DDB ADDRESS (0 IF IDLE) DFFLGS: .BYTE 37 ;STANDARD FACILITY INDICATOR .BYTE 200 ;(NORMAL & FILE-BASED) .BYTE 4 ;STANDARD BUFFER SIZE/16 .BYTE DF.INT-DF ;T.V. CONTENT .BYTE 240 ;PRIORITY FOR T.V. .BYTE 0 ;DESPATCH TABLE .BYTE DF.TFR-DF ;SHOWS TFR RTN ONLY .BYTE 0 .BYTE 0 .BYTE 0 ;SPARE DF.NAM: .RAD50 'DF' .WUNUSED WORD MOV #-LBLSIZ,DTPAR+6;FLAG IT AS LABEL RECORD JSR PC,MTGO ;DO WRITE CLR DTPAR+6 ;NEXT TIME WRITE 256 WORDS.. BIT #MTBOT,(SP)+ ;TIME TO WRITE ROLLIN? BEQ MTOUT4 ;NO... MTOUT5: MOV #MTBOOT,DTPAR+4 ;WRITE BOOTSTRAP JSR PC,MTGO ;DO WRITE MOV #BOOT,DTPAR+4 ;WRITE ROLLIN ITSELF MOV #SIZBLK,DTPAR+6 ;ROLLIN SIZE IN BLOCKS JSR PC,MTGO ;DO WRITE MTOUT4: MOV #BUF1,R0 MOV R0,DTPAR+4 ;SET UP BUFFER ADDRESS CLR DTPAR+6 ;RECORD IS 256 WORDS MOV MTREEL,(R0)+ ;STORE REEL NUMBER TRAN #MTLB,#MTRNBK ;READ ANOTHER RECORD .WAIT #MTLB ;WAIT FOR IT MOV BUFSIZ,-(SP) ;FIND OUT HOW BIG IT IS SUB TRNWC,(SP) ;NOW TOP OF STACK HAS THE SIZE OF THE RECORD BEQ TO30 ;IF EOF - CLOSE UP ASL (SP) ;MAKE THE SIZE BYTES INSTEAD OF WORDS MOV #3,-(SP) ;THE STACK IS JUST ABOVE THE BUFFER - SET A CLR -(SP) ;HEADER ABOVE MOV 4(SP),(SP) ;THE BUFFER MOV SP,R2 ;SAVE THE NUMBER .WRITE #TOFRLB,R2 ;WRITE IT OUT .WAIT #TOFRLB ;WAIT FOR IT TST (SP)+ ;POP THE MAX COUNT BIT #177400,( .TITLE DV.DC ;DISK DRIVER (DDC) VERSION 1 ; ; THIS IS A MODIFIED VERSION OF THE RF11 DISK DRIVER, ; WHICH WILL RUN THE GULF DDC DISK (CALLED DC: AS FAR AS ; DOS-11 IS CONCERNED). ; ; CREATED ON MAY 14, 1973 BY DAVE MCMILLEN ; ; RESIDENT MONITOR ROUTINE FOR SYSTEM USAGE ; CONTAINS SET UP & TRANSFER ROUTINES ONLY R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL DC ;TABLE OF STANDARDS AND POINTERS DF: ;LEFT IN FOR REFERENCES IN ORIGINAL DRIVER DC: .WORD 0 ;CURRENT DDB ADDRESSORD DF.DIR ;MFD BLOCK .WORD 0 ;REQUIRED FOR BIT MAP INFO ;TRANSFER INITIATE DF.TFR: MOV @PC,DF.RTC ;ZERO RETRY COUNT .IF NDF,DDCDAR DF.RPT: MOVB @PC,@#DF.DCS+1 ;CLEAR DISK IN CASE OF ERROR MOV DF,R0 ;GET DDB ADDRESS CMP (R0)+,(R0)+ ;BUMP POINTER TO BLOCK NO. MOV #DF.DCS+12,R2 ;SET HWR POINTER MOVB @PC,R3 ;SET UP BLOCK CONVERSION MOV (R0)+,R4 ;GET BLOCK NUMBER (******) ASL R4 ;CONVERT TO WORDS ROLB R3 BCC .-4 MOV R3,-(R2) ;SET UP DISK  INC MTREEL ;FOR NEXT LABEL IF ANY MOV #255.,R1 ;CLEAR THE REST OF THE BLOCK MTOUT2: CLR (R0)+ DEC R1 ;SOB R1,MTOUT2 BNE MTOUT2 JSR PC,MTGO ;WRITE ROLLIN LABEL MOV #-1,MTRWD ;SET FLAG TO NORMAL BR MTOUT3 ;MAGTAPE IO DRIVER MTGO: MOV #15.,R4 ;LOAD ERROR COUNT MTGO0: MOV #MTACMA,R1 MOV DTPAR+4,(R1) ;LOAD BUFFER ADDRESS MOV DTPAR+6,-(R1) ;LOAD BLOCK COUNT BLT MTG16 ;IF NEGATIVE IT'S THE ACTUAL SIZE MTGO0A: BNE .+4 ;IS IT LABEL (0 LENGTH) INC (R1) ;YES...MAKE IT 256 WORDS LOSP)+ ;CHECK THE STATUS BNE TO25 ;ERROR - SHOW IT TST (SP)+ ;POP ACTUAL BYTE COUNT BR TO20 ;AND READ AGAIN TO25: TST (SP)+ ;POP THE EXTRA WORD .WRITE #CMOLB,#TOFRER ;ERROR - TELL THE USER JSR R5,ECHO .WORD TOFRER JMP NEXTCM ;AND PICK UP ANOTHER COMMAND - FILE IS STILL OPEN TO30: TST (SP)+ ;POP THE BYTE COUNT .CLOSE #TOFRLB ;CLOSE THE FILE BR TO10 ;AND PICK UP THE NEXT FILE TO50: MOV #MTLB,R1 ;SET UP FOR THE "TO" VERSUS THE "FROM" MODE MOV #TOFRLB,R2 ;DONE TO55: MOV BUFADR,TOF (0 IF IDLE) DFFLGS: .BYTE 37 ;STANDARD FACILITY INDICATOR .BYTE 200 ;(NORMAL & FILE-BASED) .BYTE 4 ;STANDARD BUFFER SIZE/16 .BYTE DF.INT-DF ;T.V. CONTENT .BYTE 240 ;PRIORITY FOR T.V. .BYTE 0 ;DESPATCH TABLE .BYTE DF.TFR-DF ;SHOWS TFR RTN ONLY .BYTE 0 .BYTE 0 .BYTE 0 ;SPARE DF.NAM: .RAD50 'DC' .WORD DF.DIR ;MFD BLOCK .WORD 0 ;REQUIRED FOR BIT MAP INFO ;TRANSFER INITIATE DF.TFR: MOV @PC,DF.RTC ;ZERO RETRY COUNT DF.RPT: MOV #400,@#DADDRESS & EXT. MOV R4,-(R2) MOV (R0)+,-(R2) ;MOVE IN WORD COUNT ... MOV (R0)+,-(R2) ;& MEMORY ADDRESS .IFF DF.RPT: MOV #400,@#DF.DCS ;CLEAR DISK IN CASE OF ERROR MOV DF,R0 ;GET DDB ADDRESS CMP (R0)+,(R0)+ ;BUMP POINTER TO BLOCK NO. MOV #DF.DCS+10,R2 ;SET HWR POINTER MOV (R0),-(R2) ;SET BLOCK NUMBER AS SECTOR NUMBER MOV (R0)+,@#177570 ;DISPLAY IN DATA LIGHTS MOV (R0)+,-(R2) ;SET MEMORY ADDRESS MOV (R0),NOT4 BIC #177774,NOT4 ;IS THE WORD COUNT A MULTIPLE OF FOUR? BEQ SETWC ;YES NG. ASL (R1) SWAB (R1) ;AND MULTIPLY BY 512 NEG (R1) MTG16: TST -(R1) ;R1 = MTAC MOVB DTPAR,MTG.XX ;LOAD MT.CMD 0 ;DYNAMIC FUNCTION MTG.XX=.-2 TSTB (R1) ;WAIT TILL DONE BPL .-2 TST (R1) BMI MTGO1 ;BRANCH IF ERROR TST (R1)+ TST (R1)+ ;WAS A SHORT RECORD READ?? BNE MTGO2 ;BRANCH IF SO (OUCH) MTGOX: RTS PC ;NO ERRORS...WASN'T THAT EASY MTGO2: TST MCOPYX ;ARE WE COPYING MAGTAPE? BGE MTGOX ;YES....SO IGNORE THIS ERROR MOVB -(R1),R0 ;RECORD WAS LESS THAN I WANTED ASRTB+2 ;SET THE TRANSFER ADDRESS CLR R0 ;CLEAR R0 FOR A DOUBLE EOF FLAG TO60: .TRAN R1,#MTRNBK ;READ A RECORD .WAIT R1 ;WAIT FOR IT CMP BUFSIZ,TRNWC ;EOF? BEQ TO70 ;YES - HANDLE IT MOV BUFSIZ,TOFRTW ;SET UP THE OUTPUT WC SUB TRNWC,TOFRTW ;FOR THE TRANSFER .TRAN R2,#TOFRTB ;DO IT .WAIT R2 ;WAIT FOR IT BR TO55 ;AND KEEP ON MOVING TO70: MOV #2,SFBLK ;WRITE EOF FUNCTION .SPEC R2,#SFBLK ;WRITE AN EOF TST R0 ;WERE WE HERE JUST BEFORE? BNE TO80 ;YES - ALL DONE INC R0 ;NO - SET F.DCS ;CLEAR DISK IN CASE OF ERROR MOV DF,R0 ;GET DDB ADDRESS CMP (R0)+,(R0)+ ;BUMP POINTER TO BLOCK NO. MOV #DF.DCS+10,R2 ;SET HWR POINTER MOV (R0),-(R2) ;SET BLOCK NUMBER AS SECTOR NUMBER MOV (R0)+,@#177570 ;DISPLAY IN DATA LIGHTS MOV (R0)+,-(R2) ;SET MEMORY ADDRESS MOV (R0),NOT4 BIC #177774,NOT4 ;IS THE WORD COUNT A MULTIPLE OF FOUR? BEQ SETWC ;YES - ALL IS WELL MOV (R0),R5 ;NO - SAVE THE THREE WORDS NEG R5 ;AFTER THE END OF THE TRANSFER ASL R5 ;MAKE IT BYTE COUNT POSITIVE - ALL IS WELL MOV (R0),R5 ;NO - SAVE THE THREE WORDS NEG R5 ;AFTER THE END OF THE TRANSFER ASL R5 ;MAKE IT BYTE COUNT POSITIVE ADD (R2),R5 ;FOR A LATER RESTORE MOV R5,SAVEAD ;SAVE THE ADDRESS MOV (R5)+,SAVE1 ;***** NOTE: THIS COULD CAUSE PROBLEMS MOV (R5)+,SAVE2 ;***** IF A .TRAN BUFFER WAS IMMEDIATELY MOV (R5),SAVE3 ;***** FOLLOWED BY VARIABLE STOREAGE THAT ;***** CHANGED DURING THE TRANSFER! ;***** (BUT ONLY IF (WC&3).NE.0) SETWC: MOV (R0)+,-(R2) ;MOVE IN WORD COUNT BIC R R0 ;GET NUMBER OF BLOCKS NOT READ ADD R0,BUFSIZ ;AND ADJUST BUFSIZ FOR WRITE MOV #MTXAB,IN ;FUDGE NEXT CALL TO @IN TO ABORT MTRW3: CLR R2 ;DON'T ABORT AT EOF! MOV #1,MTSKIP ;SKIP TO EOF BR MTRW2 ;FALL OUT THRU SKIP MTGO1: DEC R4 ;CHECK ERROR COUNT BEQ MTRWF. ;BRANCH TO FATAL ERROR TST -(R1) BMI MTRWF. ;ILLEGAL COMMAND IS FATAL ERROR BIT #MTEOF+MTCRE+MTPAE+MTEOT,(R1) ;IS IT AN INTERESTING ERROR BNE MTGO1A ;CONTINUE IF NORMAL ERROR BIT #MTRLE,(R1) ;IS IT A PHONY ERROR UP R0 BR TO60 ;AND GO AGAIN TO80: MOV #3,SFBLK ;REWIND THE .SPEC #TOFRLB,#SFBLK ;TAPE HE SPECIFIED TO90: MOVB #3,SFBLK ;AND REWIND THE NORMAL .SPEC #MTLB,#SFBLK ;MAGTAPE .RLSE #TOFRLB ;RELEASE THE DRIVER WE JUST USED JMP NEXTCM ;AND LEAVE .SBTTL *** "TO" AND "FROM" COMMON ROUTINES ; TOFRM0: JSR PC,GETCNS ;ROUTINE TO FIND THE DEVICE SPECIFIED DEC R3 ;AND SET UP/.INIT THE LINK BLOCK JSR PC,TOFRMS ;GO PICK UP THE FIRST CHARACTER MOVB R5,RAD501 ;SAVE IT JSR PC,TOFRMS ;SECOND MOV ADD (R2),R5 ;FOR A LATER RESTORE MOV R5,SAVEAD ;SAVE THE ADDRESS MOV (R5)+,SAVE1 ;***** NOTE: THIS COULD CAUSE PROBLEMS MOV (R5)+,SAVE2 ;***** IF A .TRAN BUFFER WAS IMMEDIATELY MOV (R5),SAVE3 ;***** FOLLOWED BY VARIABLE STOREAGE THAT ;***** CHANGED DURING THE TRANSFER! ;***** (BUT ONLY IF (WC&3).NE.0) SETWC: MOV (R0)+,-(R2) ;MOVE IN WORD COUNT BIC #3,(R2) ;BE CERTAIN THAT IT IS OK MOV (R0)+,R1 ;GET FUNCTION BISB @PC,R1 ;ADD INT ENB & GO BIC #177470,R1 ;REMOVE OTHER GARBAGE #3,(R2) ;AND BE CERTAIN THAT IT IS OK .ENDC MOV (R0)+,R1 ;GET FUNCTION BISB @PC,R1 ;ADD INT ENB & GO BIC #177470,R1 ;REMOVE OTHER GARBAGE (******) MOV R1,-(R2) ;SEND TO CONTROL RTS PC ;RETURN TO MONITOR FOR NOW ;(******) - CARE!!!! USED AS LITERAL BY PREVIOUS INSTRUCTION ;INTERRUPT SERVICE DF.INT: MOV @#V.RSAV,-(SP) JSR R5,@(SP)+ .IF DF,DDCDAR MOV NOT4,R5 ;WAS THE TRANSFER A MULTIPLE OF FOUR WDS? BEQ GONE ;YES - ALL IS WELL, LEAVE MOV BEQ MTGO0 ;RETRY ON OTHER ERRORS TST MCOPYX ;IS IT MAGTAPE COPY? BLT MTGOX ;IF NOT IGNORE RECORD LENGTH ERRORS JSR R5,MES ;ELSE RECORD IS TOO LONG FOR BUFFER + MTARTL ;TELL HIM ABOUT IT BR MTRWA. ;AND ABORT MTGO1A: BIT #MTEOF,(R1) ;CHECK FOR END OF FILE BEQ MTGO3 ;BRANCH IF NOT TST MCOPYX ;IS IT MAGTAPE COPY? BLT 17$ ;IF NOT DO SPECIAL CHECK COM R4 ;MAKE R4 NEGATIVE TO INDICATE EOF RTS PC ;AND EXIT 17$: TST DTPAR+6 ;WERE WE TRYING TO READ LABEL BGE MTGO1B ;NO... JB R5,RAD502 ; JSR PC,TOFRMS ;POSSIBLE THIRD MOVB R5,RAD503 ;FOR LARGE SYSTEMS JSR PC,ASCRAD ;CONVERT TO RAD50 BR TOFRM9 ;ERROR - ABORT TST R4 ;ANYTHING THERE? BEQ TOFRM9 ;NO - ABORT JSR PC,GETUNT ;GO PICK UP THE UNIT NUMBER MOVB R0,TOFRLB+5 ;SET THE UNIT NUMBER IN THE LINK BLOCK CMP R5,#': ;FOLLOWED BY THE CORRECT CHARACTER? BNE TOFRM9 ;NO - ERROR CMPB RUNUNT,R0 ;IS THE UNIT THE SAME AS THE MAGTAPE UNIT? BNE TOFRM7 ;NO - KEEP GOING CMP (PC)+,R4 ;IS THE DEVICE MAGTAPE? .RA(******) MOV R1,-(R2) ;SEND TO CONTROL RTS PC ;RETURN TO MONITOR FOR NOW ;(******) - CARE!!!! USED AS LITERAL BY PREVIOUS INSTRUCTION ;INTERRUPT SERVICE DF.INT: MOV @#V.RSAV,-(SP) JSR R5,@(SP)+ MOV NOT4,R5 ;WAS THE TRANSFER A MULTIPLE OF FOUR WDS? BEQ GONE ;YES - ALL IS WELL, LEAVE MOV SAVEAD,R0 ;SET UP TO MOVE MOV SAVE1,(R0)+ ;AND MOVE THEM DEC R5 ;BUT ONLY WHAT IS NEEDED BEQ GONE MOV SAVE2,(R0)+ DEC R5 BEQ GONE MOV SAVE3,(R0) GONSAVEAD,R0 ;SET UP TO MOVE MOV SAVE1,(R0)+ ;AND MOVE THEM DEC R5 ;BUT ONLY WHAT IS NEEDED BEQ GONE MOV SAVE2,(R0)+ DEC R5 BEQ GONE MOV SAVE3,(R0) GONE: MOV #DDCDAR-6,R1 ;ERROR CAUSE INTERRUPT? .IFF MOV #DF.DCS,R1 ;ERROR CAUSE INTERRUPT? .ENDC MOV (R1)+,R2 BMI DF.ERR ;YES - GO FIND CAUSE MOV DF,R0 ;GET DDB ADDRESS DF.XIT: MOV 14(R0),PC ;RETURN MONITOR ;ERROR ROUTINE: DF.ERR: BIT #11000,R2 ;PARITY OR MISSED? BEQ DF.OFF DF.AGN: ASL #0 ;YES - RETRIED 8 TIMES? DF.RTC=.-2 SR R5,MES ;CANT FIND FILE + CNF BR MTRWA. ;FATAL ERROR ;WE HAVE READ EOF...OPEN ANOTHER REEL MTGO1B: JSR R5,MES ;TELL HIM ABOUT IT + MTEOF0 JSR R5,INPUT + MTEOF1 TST (SP)+ ;FLUSH MTGO RETURN OFF STACK JMP MTIN6 ;AND GET RESPONSE TO QUESTION MTGO3: BIT #MTCRE+MTPAE,(R1) ;PARITY ERROR? BEQ MTGO4 ;IF NOT IT MUST BE EOT JSR PC,BKSP ;BACKUP OVER THE LAST RECORD CMP DTPAR,#MTWT ;WAS THE FUNCTION A WRITE BNE MTGO0 ;NO..THEN CONTINUE MOV #MTWTX,DTPAR ;NEXT TRY WRITE WITH EXTEND50 /MT/ ;? BEQ TOFRM9 ;YES - ERROR TOFRM7: JSR PC,GETC ;CHECK OUT THE REST OF THIS MOV (SP)+,R1 ;PICK UP THE RETURN ADDRESS IN CASE OF ERR JSR PC,DEN80 ;CHECK THE SYNTAX MOV #255.,TOFRSZ ;SET UP THE SIZE OF THE DATA BLOCKS ON DISK CMP (PC)+,R4 ;SEE IF IT IS A FIXED HEAD DISK .RAD50 /DF/ ;RF11? BEQ TOFRM1 ;YES - SET UP CMP (PC)+,R4 ; .RAD50 /DC/ ;RC11? BNE TOFRM2 ;NO - NORMAL DISK TOFRM1: MOV #63.,TOFRSZ ;CHANGE THE SIZE DEFAULT TOFRM2: MOV R4,TOFRLB+6 ;SET UP THE DEFAULT DEVE: MOV #DF.DCS,R1 ;ERROR CAUSE INTERRUPT? MOV (R1)+,R2 BMI DF.ERR ;YES - GO FIND CAUSE MOV DF,R0 ;GET DDB ADDRESS DF.XIT: MOV 14(R0),PC ;RETURN MONITOR ;ERROR ROUTINE: DF.ERR: BIT #11000,R2 ;PARITY OR MISSED? BEQ DF.OFF DF.AGN: ASL #0 ;YES - RETRIED 8 TIMES? DF.RTC=.-2 BCS DF.PER ;IF SO FORCE CONTINUE JSR PC,DF.RPT ;OTHERWISE TRY AGAIN DF.REC: MOV @#V.XIT,R5 JMP 4(R5) DF.PER: BIS #100000,12(R0) ;RETURN PARITY FAIL FLAG BR DF.XIT ;EXIT NOW ;ERROR IS NOT IMMEDIATELY RECOVERABLE:BCS DF.PER ;IF SO FORCE CONTINUE JSR PC,DF.RPT ;OTHERWISE TRY AGAIN DF.REC: MOV @#V.XIT,R5 JMP 4(R5) DF.PER: BIS #100000,12(R0) ;RETURN PARITY FAIL FLAG .IF DF,DDCDAR BR DF.XIT ;AND TAKE THE EXIT FOR COMPLETION .IFF TST @R1 ;ALREADY AT BLOCK END? BEQ DF.XIT ;IF SO EXIT NOW TST DF.RTC ;OTHERWISE CHECK IF 2ND TIME BEQ DF.OFF ;IF SO NO POINT IN MORE INC -(R1) ;CONTINUE DISK TRANSFER BR DF.REC ;... VIA COMMON EXIT .ENDC ;ERROR IS NOT IMMEDIATELY RECOVERABLE: DF.OFF: CLR DF DED IRG BR MTGO0 MTGO4: TST MCOPYX ;IS IT MAGTAPE COPY? BGE MTGOX ;IF SO IGNORE EOT! JSR PC,BKSP ;BACKUP OVER LAST RECORD JSR PC,WTEOF ;WRITE THE NECESSARY END OF FILE JSR R5,INPUT ;TELL HIM ABOUT THE PROBLEM + ERREOT CMPB (R0),#'M ;DOES HE WANT TO CONTINUE BNE MTRWA ;NO...SO ABORT THE OPERATION JSR R5,INPUT ;WAIT FOR TAPE MOUNTED + MTMONT MOV #1,MTRWD ;FORCE REWIND AND LABEL CHECKING TST (SP)+ ;FLUSH MTGO RETURN OFF STACK JMP MTOUT ;AND CONTINUE MTRWF.: BR MTRWF ;SICE MOVB #3,SFBLK ;DO A REWIND ON THE CURRENT DRIVE .SPEC #MTLB,#SFBLK ; .INIT #TOFRLB ;INIT IT CMP R4,(PC)+ ;IS IT THE MAGTAPE? .RAD50 /MT/ BEQ TOFRM3 ;YES - DON'T SKIP ON RETURN TST (R1)+ ;UP THE RETURN BY TWO TOFRM3: JMP (R1) ;LEAVE TOFRM9: TST (SP)+ ;POP THE RETURN JMP ILLCOM ;AND SHOW THAT IT IS BAD SYNTAX ; .WORD 0 TOFRLB: .WORD 0 .RAD50 /XXX/ ;LOGICAL NAME .WORD 1 ;UNIT AND NUMBER TO FOLLOW .RAD50 /XXX/ ;CHANGED FROM ABOVE ; TOFRSZ: .WORD 0 ;DEFAULT SIZE ;  DF.OFF: CLR DF ;FREE DISK FOR EDP MOV -(R1),-(SP) ;DISK STATUS IS EVIDENCE MOV #DF.ENO,-(SP) ;SET UP ERROR NO. BIT #SDRVR,DFFLGS ;SYSTEM DRIVER? BEQ DF.SND ;NO - BRANCH CLR @SP ;CODE TO FORCE A HALT DF.SND: IOT ;GO TO DIAG. PRT. ; SAVEAD: 0 ;SAVE LOCATIONS IN CASE OF NOT TRANSFERRING A MULTIPLE SAVE1: 0 ;OF FOUR WORDS (UNUSED OTHERWISE) SAVE2: 0 SAVE3: 0 NOT4: 0 ;FLAG INDICATION A NOT MULT OF 4 XFER (IF NON-ZERO) ; ;DEFINITIONS: DF.DCS=165300 DF.DIR=1 DF.ENO=1426 V.XIT=42 V. ;FREE DISK FOR EDP MOV -(R1),-(SP) ;DISK STATUS IS EVIDENCE MOV #DF.ENO,-(SP) ;SET UP ERROR NO. BIT #SDRVR,DFFLGS ;SYSTEM DRIVER? BEQ DF.SND ;NO - BRANCH CLR @SP ;CODE TO FORCE A HALT DF.SND: IOT ;GO TO DIAG. PRT. ; .IF DF,DDCDAR SAVEAD: 0 ;SAVE LOCATIONS IN CASE OF NOT TRANSFERRING A MULTIPLE SAVE1: 0 ;OF FOUR WORDS (UNUSED OTHERWISE) SAVE2: 0 SAVE3: 0 NOT4: 0 ;FLAG INDICATION A NOT MULT OF 4 XFER (IF NON-ZERO) .ENDC ; ;DEFINITIONS: DF.DCS=177460 DF.DIR=1 DF.ENO=1426 V.XITUBROUTINE CHECKS "REWIND" FLAG AND MTSKIP ;IF MTRWD = -1 NORMAL EXIT ; = 0 CHECK MTSKIP (AND DO LABEL CHECK) ; = +1 REWIND UNIT, THEN CHECK MTSKIP ;WHEN MTSKIP IS NON-ZERO IT CONTAINS THE NUMBER OF FILES TO SKIP... MTRWSK: MOV MTRWD,R0 ;GET FLAG BLT MTRWX1 ;NORMAL EXIT... BEQ MTRW0 ;GO CHECK MTSKIP JSR PC,REWIND ;REWIND THE MAGTAPE MTRW0: MOV #1,R2 ;IF WE SEE AN IMMEDIATE EOF IT EOD ON TAPE MTRW2: MOV #MTAC,R1 ;SET UP R1 JUST IN CASE MT.CMD MTSF ;SET FOR SKIP FORWARD TST MTSKI; TOFRTB: 0 ;BLOCK 0 0 ;BUFFER ADDR GETS SET HERE TOFRTW: 0 ;SIZE OF BUFFER SET HERE .BYTE 3,0 ;WRITE IN BINARY 0 ;RESIDUE COUNT ; TOFRMS: JSR PC,GETC ;PICK UP THE NEXT CHARACTER CMP R5,#'0 ;NUMBER? BLT TOFRMX ;NO CMP R5,#'9 ;STILL NUMBER? BGT TOFRMR ;NO - RETURN TOFRMC: DEC R3 ;YES - BACK UP OVER IT MOV #40,R5 ;CHANGE IT TO A SPACE TOFRMX: CMP R5,#12 ;TERMINATOR? BEQ TOFRMC ;YES - CHANGE IT TOFRMR: CMP R5,#': ;TERMINATOR? BEQ TOFRMC ;YES - CHANGE IT RTS PCRSAV=44 SDRVR=10000 .END =42 V.RSAV=44 SDRVR=10000 .END P ;ARE THERE ANY SKIPS TO DO? BEQ MTRWX ;BRANCH IF NOT... ;ROUTINE SKIPS N FILES MTSK: MOV #MTABRC,R1 ;LOAD R1 CLR (R1) INC -(R1) ;AND SET GO BIT TSTB (R1) ;WAIT FOR EOF ERROR BPL .-2 BIT #MTEOF,-(R1) BEQ MTRWF ;ANYTHING OTHER THAN EOF IS FATAL DEC MTSKIP ;ARE WE DONE? BNE MTSK1 MTRWX: CLR MTRWD ;CLEAR MAGTAPE FLAG MTRWX1: RTS PC ;AND EXIT MTSK1: CMP (R1)+,(R1)+ CMP #1,(R1) ;WAS IT AN IMMEDIATE EOF? BNE MTSK3 ;IF NOT CONTINUE DEC R2 ;WAS IT SECOND EOF IN A ROW?  ;LEAVE .SBTTL *** "FROM" ; FRO00: JSR PC,TOFRM0 ;GO GET THE PARAMETERS BR FRO80 ;MAGTAPE TO MAGTAPE - DO IT MOV TOFRSZ,FRMTBS ;SET UP THE DISK BLOCK SIZE INC FRMTBS ;MINUS ONE FOR THE LINK NODE POINTER MOV BUFSIZ,R0 ;PICK UP THE BUFFER SIZE SUB 400,R0 ;DO WE SUB FRMTBS,R0 ;HAVE ENOUGH ROOM SUB FRMTBS,R0 ;FOR THE BUFFERS BLT FRO99 ;IF NOT, TELL THE USER MOV BUFADR,FRMTBA ;SET UP THE CONTROL ADD #1000,FRMTBA ;BLOCKS WITH THE PROPER ADDRESSES MOV #1,FRMTBB ; .TRAN #TOFRLB,# .TITLE INPEC INPUT ALL FILES ON PEC DRIVE 0 ; ; (THEY GO INTO CURRENT UIC) ; ; (FILES ARE WRITTEN TO LOGICAL UNIT 'DSK', WHICH DEFAULTS TO 'DC') ; ; WRITTEN BY DAVE MCMILLEN ON MAY 14, 1973 ; .MCALL .PARAMS,.INIT,.OPENO,.RLSE,.WRITE,.CLOSE,.EXIT,.WAIT .PARAMS ; ; START: .INIT #DSKLB ; WC=167540 STAT=167542 COM=167544 MA=167546 ; RDY=200 BSY=100 REW=400 READ=1 ERR=4000 EOF=100000 BEOT=40000 OFL=20000 ; .MACRO SCOM ARG MOV #ARG,@#COM .ENDM .MACRO BITSTA ARG BIT #ARG,@;COPYRIGHT 1972 DIGITAL EQUIPMENT CORPORATION ;MAYNARD, MASSACHUSETTS ; ; ;INIT THE FILE STRUCTURE. ; ; .TITLE INITFS .IDENT /EDIT16/ ;LAST EDIT 09-AUG-72 .SBTTL INITFS-INIT FILE STRUCTURE MODULE. ; ; ; ;DIRECT ASSIGNMENTS ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; UFDSIZ=9. ;WORDS PER UFD ENTRY MFDBK1=1 ;MFD BLOCK#1 UFDBK1=2 ;UFD BLOCK#1 UFDBK2=3 ;UFD BLOCK#2 PRCODE=377 ;MONITOR PROTECTION CODE. SYSUIC=401 ;SYSTEM UIC [1,1] GENUIC=100200 ;GENERAL US BNE MTSK JSR PC,BKSP CMP OUT,#MTOUT ;IS THIS OK?? BEQ MTRWX ;YEP.THATS WHERE WE WANT TO BE JSR R5,MES ;TELL HIM WE AT THE END OF TAPE + ERREOD MTRWA.: BR MTRWA ;AND QUIT MTSK3: MOV #1,R2 ;RESET R2 TO EOF STATE BR MTSK ;CLOSE OUTPUT FILE ON MAGTAPE WTEOF: MOV #3,R4 ;WRITE 3 EOF RECORDS WTEOF1: MOV #MTAC,R0 MT.CMD MTWTE ;EXECUTE WRITE EOF TSTB (R0) BPL .-2 ;WAIT FOR DONE DEC R4 BGT WTEOF1 ;PERFORM 3 TIMES MOV #2,MTSKIP ;NOW SKIP BACK OVER 2 EOF'S CLR R2 ;FUDGE COUFRMTBB ;READ IN THE MFD FIRST BLOCK MOV #105,-(SP) EMT 41 ;GET THE USER'S UIC MOV (SP)+,R5 ;SET UP THE UIC IN R5 .WAIT #TOFRLB ;WAIT FOR MFD BLOCK #1 FRO02: MOV @FRMTBA,FRMTBB ;SET UP FOR THE NEXT MFD BLOCK BEQ FRO90 ;IF NONE - NON-EXISTANT UIC ON THIS DISK .TRAN #TOFRLB,#FRMTBB ;READ THE NEXT MFD BLOCK IN .WAIT #TOFRLB ;WAIT FOR IT MOV FRMTBA,R1 ;SET UP TO SCAN IT FOR THE UIC INC R1 ;START AT THE SECOND WORD OF THE BLOCK INC R1 ;TWO INCREMENTS = ONE WORD MOV FRMTBS,R2 ;SET UP#STAT .ENDM ; BEGIN: SCOM REW BITSTAT RDY!BSY BNE OK MOV #-1,-(SP) MOV (PC)+,-(SP) .BYTE 2,1 ;A002 177777 IOT BR BEGIN OK: JSR PC,WAIT LOOP: CLR LEOF ZORK: MOV #FILB,@#MA MOV #7,@#WC SCOM READ JSR PC,WAIT CLR FILB-2 MOV #FILB-2,ZORK+2 CLR FILB+6 CLR FILB+10 MOV #FILB,R0 .OPENO #DSKLB,R0 .PAGE MOV #-1,LEOF RLOOP: MOV #BUF,@#MA MOV #400,@#WC SCOM READ JSR PC,WAIT .WRITE #DSKLB,#BUFFR .WAIT #DSKLB BR RLOOP CLOSE: .CLOSE #DSKLB BR LOOP WAIT: BITSTA RER UIC[200,200] BATCHU=402 ;DEFAULT BATCH UIC[1,2] WR.FUN=2 ;TRAN WRITE FUNCTION. ; ;GLOBL ASSIGNMENTS ; .GLOBL INITFS .GLOBL FB,DOSSIZ .GLOBL INTER,BLOCKS ;INTERLEAVE FACTOR FOR DISK. .GLOBL COMTRN ;COMMON TRAN ROUTINE. .GLOBL RSAV,RRES .GLOBL OUTBK2 ;DATA BLOCKS. .GLOBL OUTFIL .GLOBL CDATE ;CREATION DATE OF CIL FOR UFD ENTRY. .GLOBL DISKSZ ;DISK SIZE @BSIZE WORD BLKS .GLOBL OUTRN ;TRAN BLOCK. .GLOBL OUTLNK,TRAN ;LINK BLOCK,TRAN BLOCK. .GLOBL WAIT .GLOBL WRITE NT FOR MTSK MT.CMD MTSR ;LOAD NEW FUNCTION BR MTSK ;AND FALL OUT THROUGH MTSK ;BACKSPACE OVER RECORD JUST READ/WRITTEN BKSP: MOV #MTABRC,R1 ;SET UP R1 MOV #-1,(R1) ;AND SKIP ONLY ONE RECORD TST -(R1) MT.CMD MTSR+1 ;EXECUTE SKIP REVERSE TSTB (R1) BPL .-2 ;WAIT FOR DONE RTSX: RTS PC ;AND EXIT ;SUBROUTINE REWINDS THE SELECTED MAGTAPE REWIND: MOV #MTAS,R1 BIT #MTBOT,(R1)+ ;ARE WE AT BOT? BNE RTSX ;IF SO FORGET ABOUT REWIND MT.CMD MTREW ;REWIND TAPE TST -(R1) ;LOOK AT STAT FOR THE NUMBER OF WORDS IN THE BLOCK DEC R2 ;MINUS ONE FOR THE LINK POINTER ASR R2 ;DIVIDE THIS ASR R2 ;BY FOUR (NUMBER OF WORDS PER MFD ENTRY) FRO04: CMP (R1)+,R5 ;IS THIS THE ONE? BEQ FRO06 ;YES - FOUND THE USER'S STUFF ADD #6,R1 ;NO - UP TO THE NEXT ONE DEC R2 ;COUNT IT BGT FRO04 ;IF MORE, KEEP LOOKING BR FRO02 ;IF NOT, GET THE NEXT BLOCK ; ; FRO70: MOVB #2,SFBLK ;ALL FILE ARE WRITTEN OUT - WRITE TWO END-OF-FILES .SPEC #MTLB,#SFBLK ;WRITE #1 .SPEC #MTLB,#SFBLK ;WRITE #2DY!BSY BEQ GONE WHOLD: BITSTA RDY BNE WHOLD WLOOP: BITSTA RDY BEQ WLOOP BITSTA EOF BNE EOFIN BITSTA ERR!OFL!BEOT BNE ERROR RTS PC EOFIN: CLR @#STAT INC LEOF TST LEOF BEQ FILED SCOM REW .EXIT FILED: TST (SP)+ BR CLOSE ERROR: MOV @#STAT,-(SP) DEAD: MOV (PC)+,-(SP) .BYTE 77,1 IOT .EXIT GONE: CLR -(SP) BR DEAD LEOF: 0 0 DSKLB: 0 .RAD50 /DSK/ 1 .RAD50 /DC/ ; 0,0 FILB: .BLKW 7 ; BUFFR: 1000,3,1000 BUF: .BLKW 400 .END START  .SBTTL ; ; THE FOLLOWING PARAMETERS MUST BE SET BEFORE CALLING 'INITFS': ; 1. BLOCKS # OF BLOCKS RESERVED FOR CIL. ; 2. CDATE CREATION DATE OF CIL. ; 3. FB ABSOLUTE FIRST BLOCK # OF CIL. ; 4. SIZADR SIZE DETERMINATION ROUTINE. ; 5. BSIZE LOGICAL BLOCK SIZE ; 6. DISKSZ # OF DOS-SIZED BLOCKS. ; ; ; IN ADDITION, THE BOOTSTRAP MUST HAVE BEEN HOOKED WITH THE ; MONITOR CIL ALREADY AND MOVED INTO THE 'OUTBK2' AREA. ; ; INITFS: JSR R5,RSAV ;SAVE CALLER'S US REGISTER BIT #MTTUR,(R1) ;WAIT ON UNIT READY BEQ .-4 TST (R1) BPL RTSX ;IF OK THEN EXIT MTRWF: JSR R5,MES ;FATAL MAGTAPE ERROR + ERRMTF MTRWA: JMP COMCON ;ABORT ;SUBROUTINE COMPUTES THE NUMBER OF DECTAPE BLOCKS OR DISK ;SECTORS (256 WORDS IN BOTH CASES) TO TRANSFER. ONLY THE ;LAST TRANSFER CAN BE A PARTIAL TRANSFER. ROOM1: ADD #LB0,R0 ;TAKE UNUSED DECTAPE BLOCKS INTO ACCOUNT SUB @(R5)+,R0 ;SUBTRACT CURRENT BLOCK NUMBER SUB BUFSIZ,R0 ;SUBTRACT BUFFER SIZE AVAILABLE BR ROOMC .WAIT #MTLB ;WAIT FOR IT MOVB #3,SFBLK ;NOW WE REWIND THE TAPE .SPEC #MTLB,#SFBLK ;FOR THE USER JMP NEXTCM ;NAD GO GET THE NEXT COMMAND ; FRO80: MOV #MTLB,R2 ;MAGTAPE TO MAGTAPE TRANSFER MOV #TOFRLB,R1 ;SET UP FOR IT AND LET THE "TO" PROCESSOR JMP TO55 ;DO ALL OF THE WORK ; FRO90: .WRITE #CMOLB,#FRONFE ;ERROR MESSAGE - NO FILES JSR R5,ECHO .WORD FRONFE JMP NEXTCM ;GET THE NEXT COMMAND FRO99: .WRITE #CMOLB,#FRONBE ;ERROR MESSAGE - NO BUFFER SPACE JSR R5,ECHO .WORD FRONBE JaBqF V)͋,L PAS C` 58 eePPe ($ ffetea~ f@  /K |  p   &$ !"$U%Gv  7  a & &  &ff P0e@1& & 2%"U%efaeP $^ ( &^ E $  (&  U ( " zREGISTRS. MOV DISKSZ,R0 ;ARGUMENT UNIT SIZE(BLKS). MOV #OUTBK2,-(SP) ; .SBTTL CLR -CLEAR ALL BLOCKS TO 0. ; ;THREE PASSES ARE MADE OVER THE DISK TO CLEAR ;EVERY BLOCK TO ZERO. THE BLOCK SIZES FOR THE ;CLEARING PROCESS IS 256. WORDS PER BLOCK. ; 1ST PASS CLEARS 0,3,6,... ; 2ND PASS CLEARS 1,4,7,... ; 3RD PASS CLEARS 2,5,8,... ; CLR: CLR R1 ;SET BLOCK COUNTER MOV #3,R4 ;PASS COUNTER CLR10: JSR PC,OUTPUT ;WRITE THIS BLOCK NO. TST R1 ;WAS IT BLOCK 00000?? BNE CLR20 ;NO..ALREADY AK ; ROOM: MOV (R5)+,-(SP) ;STACK ADDRESS OF CRRENT BLOCK NUMBER MOV (SP),-(SP) ;TWICE ADD #2,2(SP) ;POINT TO MSB OF CURRENT BLOCK # SUB @(SP)+,R0 ;SUBTRACT CURRENT BLOCK NUMBER SBC R1 ;(DOUBLE PRECISION FOR DEM BIG DISKS) SUB @(SP)+,R1 ; SUB BUFSIZ,R0 ;SUBTRACT BUFFER SIZE AVAILABLE SBC R1 ; ROOMCK: BMI 1$ ;SKIP IF LAST TRANSFER(PARTIAL BLOCK) CLR R0 ;ELSE WILL JUST USE BUFFER SIZE 1$: ADD BUFSIZ,R0 ; MOV R0,@(R5)+ ;STORE RESULT IN PARAMETER BLOCK RTS R5 ;AND QUIT INPUT: MMP NEXTCM ; ; ONE FILE HAS BEEN WRITTEN OUT - WRITE AN EOF FRO40: MOVB #2,SFBLK ;SET UP FOR AN EOF WRITE .SPEC #MTLB,#SFBLK ;DO IT SUB FRMTBS,FRMTBA ;BACK DOWN TO THE NORMAL BUFFER SUB FRMTBS,FRMTBA FRO50: ADD FRMUDS,R1 ;INCREMENT OVER THE UFD WE JUST LOOKED AT SUB FRMUDS,R0 ;COUNT DOWN BGE FRO15 ;IF MORE, KEEP LOOKING JMP FRO10 ;IF NOT, GET THE NEXT UFD BLOCK ; ; MFD ENTRY WAS FOUND FOR THIS USER - NOW GO PICK UP ALL OF HIS FILES ; FRO06: MOV (R1)+,FRMTBB ;SET UP FOR THE BLOCK THAT a %@ 44W-& 5"< de#N#e % $a&^ %w6DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX E 5 @`e /: W:a "` @0- L a&^ % & & NU%ef&f6DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX E 5LL ZEROES. JSR PC,ZERO ;YES..CLEAR IT TO ZEROES. CLR20: ADD #3,R1 ;EVERY 3RD BLOCK CMP R1,R0 ;FINISHED THIS PASS? BLO CLR10 ;NO..KEEP WRITING. DEC R4 ;FINISHED ALL PASSES? MOV R4,R1 ;SET NEW BASE BLK#. BNE CLR10 ;NO..START NEXT PASS. ; ; THE DISK IS ALL 0'S EXCEPT BOOTSTRAP BLOCK. .SBTTL CMAP -COMPUTE # OF BIT MAPS. ; ; ;THIS ROUTINE SETS THE FOLLOWING PARAMETERS: ; 1. BM.MAP # OF BIT MAPS. ; 2. BM.STR START BLOCK OF BIT MAPS. ; 3.OV (R5)+,R0 ;COMBINATION OF PROMPTER, INPUTER MOV R5,-(SP) ;SAVE RETURN MOV #GETIN,R5 ;SET INTERMEDIATE RETURN BR MESS01 ;BUT FIRST, TYPE MESSAGE MES: MOV (R5)+,R0 ;STRING ADDRESS MESS01: MOVB (R0)+,R2 ;CHARACTER TO R2 BEQ MESS04 ;ITS END OF STRING TIME. JSR PC,INIOUT ;OUTPUT THE CHARACTER IN R2 ;CODE TO CHECK FOR ^O... MESS03: TSTB @I.TKS ;HAS HE BEEN TYPING BPL MESS02 ;...NO MOV @I.TKB,R2 BIC #-177-1,R2 ;LOW 7 BIT OF CHARACTER TYPED CMPB R2,#17 ;IS IT CTRL/O? BNE MESS02 ;HAS HIS FIRST UFD BEQ FRO90 ;IF NONE, THEN QUIT MOV (R1)+,FRMUDS ;SAVE THE SIZE OF HIS UFD ENTRIES ASL FRMUDS ;MULTIPLY THE WORD SIZE BY TWO FOR BYTES ADDR BR FRO11 ;AND ON INTO THE LOOP FRO10: MOV @FRMTBA,FRMTBB ;ON TO THE NEXT UFD BLOCK BEQ FRO70 ;ALL DONE - QUIT FRO11: .TRAN #TOFRLB,#FRMTBB ;READ THE BLOCK .WAIT #TOFRLB ;AND WAIT FOR IT MOV FRMTBA,R1 ;SET UP TO SCAN IT INC R1 ;PASS UP THE LINK POINTER INC R1 MOV TOFRSZ,R0 ;SIZE OF A BLOCK -1 FRO15: TST (R1) ;IS THERE A FILaeE ΊE`e EN W= EC@@@PN a&^ %  a WR  WK [%@eJ!!! ̋ee&ap<a&^ %2 ɊA!@ , 0"3  BEB WS Ɍ  3U%## A  BM.BYT BYTES REQ. IN LAST MAP. ; ; CMAP10: MOV R0,-(SP) ;HIGHEST BLK# +1 ; ;COMPUTE THE NUMBER OF BIT MAPS BY DIVIDING BY #960. ;ONCE THE NUMBER OF BIT MAPS HAS BEEN DETERMINED ;COMPUTE THE NUMBER OF BYTES REQUIRED IN THE LAST MAP. ; CMAP20: INC R4 ;# OF MAPS REQUIRED. SUB #960.,@SP ;MORE MAPS? BHI CMAP20 ;YES..KEEP GOING. ADD #960.,@SP ;GET REMAINDER. CMP R4,@SP ;ENOUGH BITS IN LAST MAP TO COVER MAPS? BLOS 10$ ;YES - CARRY ON DEC R4 ;NO - BACK OFF ONE SUB @SP,R0 ;TAKE THESE ...NO JSR PC,INICTL ;ECHO CHARACTER MESS04: RTS R5 ;GO HOME MESS02: TSTB @I.TPS ;READY FOR NEXT CHAR OUTPUT? BPL MESS03 ;...NO BR MESS01 ;AND CONTINUE INICR: MOV #15,R2 ;FIRST THE JSR PC,INIOUT ;TO THE TTY MOV #12,R2 ;AND NOW THE INIOUT: TSTB @I.TPS ;READY? BPL INIOUT ;NOT YET MOV R2,@I.TPB ;YES-OUTPUT IT JMP INFILL ;NO GO CHECK FOR FILL GETIN: CLR RBFLAG ;CLEAR FLAG MOV #KBUF,R0 ;USE FISTAK FOR BUFFER MOV R0,R1 ;MARK BEGINNING OF BUFFER GETI01: TSTB @I.TKS E THERE? BEQ FRO50 ;NO - ON TO THE NEXT UFD ENTRY MOV BUFADR,R2 ;YES, BUILD A FILE LABEL MOV R2,TOFRTB+2 ;FOR THE FILE ON THE MAGTAPE MOV #7,TOFRTW ;FIRST SETTING UP THE .TRAN BLOCK MOV R1,R3 ;SET UP A R1 THAT WE CAN USE MOV (R3)+,(R2)+ ;MOVE THE MOV (R3)+,(R2)+ ;FILE NAME AND MOV (R3)+,(R2)+ ;EXTENSION MOV R5,(R2)+ ;THE UIC MOV 12(R3),(R2)+ ;THE PROTECT CODE MOV (R3)+,R4 ;THE CREATION DATE MOV R4,(R2) ; BIC #170000,(R2)+ ;WITH EXTRA BITS CLEARED CLR (R2) ;UNUSED WORD IS CLa@e      % % E4   :@eJ!!! E0" l@a&^  aU@  & &)cEI̕U%&^ aa&^ %ea'W0$  dU6Ul"L && $eAWAY FROM THE DISK MOV #960.,@SP ;AND SHOW A FULL LAST BLOCK 10$: ASR @SP ;DIVIDE BY 8. TO GET ASR @SP ;#OF BYTES REQUIRED TO ASR @SP ;REPRESENT LAST MAP. BIC #1,@SP ;BUT BE CERTAIN THAT IT TRANSLATES TO WDS MOV (SP)+,BM.BYT ;BYTES IN LAST MAP. SUB R4,R0 ;HIGHEST BLK# - # OF MAPS = MOV R0,BM.STR ;FIRST BIT MAP BLK# MOV R4,BM.MAP ;NUMBER OF MAPS. .SBTTL MFD -WRITE MFD BLOCKS. ; ;WRITE MFD BLOCK#1 ; ; THE DATA BUFFER IS ALL 0'S. ; R0=;ANYTHING WAITING? BPL GETI01 ;JUST THIS LOOP... MOV @I.TKB,R2 ;GET CHARACTER FROM TTY BIC #-177-1,R2 ;USE LOW ORDER 7 BITS BEQ GETI01 ;IGNOR NULLS CMPB R2,#177 ;IS IT A RUBOUT? BEQ GETI02 ;YES TST RBFLAG ;RUBOUT FLAG - IS IT SET? BEQ GETI10 ;SKIP AROUND CRAP IF NOT CLR RBFLAG MOV R2,-(SP) ;SAVE R2 SO WE CAN PRINT \ MOV #'\,R2 JSR PC,INIOUT ;ECHO BACKSLASH MOV (SP)+,R2 ;RESTORE CHARACTER GETI10: CMPB R2,#25 ;IS IT A ^U? BEQ GETI08 ;YES--ECHO ^U, AND DELETTE LINE CMPBEARED .TRAN #MTLB,#TOFRTB ;WRITE THE LABEL ON THE TAPE .WAIT #MTLB ;WAIT FOR IT TO BE DONE TST (R3)+ ;BYPASS THE USAGE COUNT MOV (R3)+,FRMTBB ;SET UP TO ACCESS THE FILE ADD FRMTBS,FRMTBA ;WITH A SECOND DISK BUFFER ADD FRMTBS,FRMTBA ;TWICE FOR BYTE ADDRESSING MOV (R3),R3 ;PICK UP THE LENGTH OF THE FILE (FOR CONTIG FLS) CLR R2 ;ZERO WORDS WRITTEN ON THE CURRENT MAGTAPE BLOCK ROL R4 ;CONTIGUOUS FILE BIT NOW IN CARRY BIT CLR R4 ;ZERO R4 ROL R4 ;AND PUT A ONE IN IF CONTIGUOUS, 0 IFa:  A ߋp͗rŀ^UWI•\ ͋Ba͊QB  BN DIA% a&^ %@& aoB: ( $W[7e Zc p  K!# bRK l c a ,  J W. ScA!W]W0W9@WAͥZfᕕW,W VA!N  ma&^ %ew J""T   fa eX%!  D b aB ! 1ST BIT MAP BLOCK NUMBER. ; R4=NUMBER OF MAPS REQUIRED. ;@SP=PTR TO DATA BUFFER. ; MFD100: MOV @SP,R1 ;SET TRAN BLK PTR. MOV R0,R2 ;1ST BIT MAP BLK NO. DEC R2 ;1ST WORD OF MFD1 IS MOV R2,(R1)+ ;PTR TO MFD2 MOV INTER,(R1)+ ;2ND WORD=INTERLEAVE FACTOR. MOV R4,R3 ;#OF BIT MAPS. MOV R0,(R1)+ ;BIT MAP START BLOCK. MFD110: MOV R0,(R1)+ ;PTR TO BIT MAP N INC R0 ;NEXT BIT MAP BLOCK#. DEC R3 ;ALL MAPS INDICATED? BNE MFD110 ;NO..KEEP MOVING MAP BLKS IN. MOV #MFDBK1,R1 ;YES..WRITE 1S1 R2,#40 ;IS IT A SPACE? BEQ GETI05 ;YES CMPB R2,#15 ;IS IT A ? BEQ GETI07 ;YES CMPB R2,#3 ;DID HE TYPE A ^C BEQ GETI09 ;YES--BACK TO COMCON GETI06: MOVB R2,(R0)+ ;JUST A PLAIN, OLD CHARACTER, SO STORE IT GETI03: JSR PC,INIOUT ;AND ECHO IT BR GETI01 ;AND WAIT SOME MORE GETI02: CMP R0,R1 ;IT'S A RUBOUT, ANYTHING IN BUFFER? BEQ GETI04 ;NO, SO ECHO CRLF0 TST RBFLAG ;IS RUBOUT FLAG SET? BNE GETI11 ;NO NEED TO TYPE \ IF IT IS MOV #'\,R2 JSR PC,INIOUT ;ECHO BACKSLASH MO LINKED ADD TOFRSZ,R4 ;ADD IN THE SIZE OF A LINKED BUFFER FRO20: .TRAN #TOFRLB,#FRMTBB ;READ THE FIRST BLOCK OF THE FILE .WAIT #TOFRLB ;WAIT FOR IT CMP R4,TOFRSZ ;LINKED OR CONTIGUOUS? BNE FRO24 ;CONTIGUOUS - BRANCH OVER MOV @FRMTBA,FRMTBB ;LINKED, SET UP THE NEXT BLOCK ADDRESS BR FRO25 ;AND OVER FRO24: INC FRMTBB ;CONTIGUOUS - INCREMENT TO THE NEXT BLOCK DEC R3 ;AND COUNT IT BGT FRO25 ;IF NOT DOEN, THEN KEEP GOING CLR FRMTBB ;IF DONE, ZERO THE NEXT BLOCK FRO25: MOV R1,-(SP) ;Saaz | E    $ &A` aEA! ea L$$E0d$^ aABD5x W U  5> 7 4. N"u͋55uM5a & MED BLOCK JSR PC,OUTPUT JSR PC,ZERO ;CLEAR DATA BUFFER. ;WRITE MFD BLOCK#2 ; ; THE MFD2 BLOCK IS AT MFD2ST , MOVE IT INTO DATA BUFFER. ; ; ; MFD200: MOV @SP,R1 ;TOP OF DATA BLOCK. MOV #MFD2ST,R4 ;START OF MFD2 TABLE. MOV (R4)+,R3 ;SIZE (WORDS) OF MFD2 TABLE. CLR (R1)+ ;LINK TO NEXT MFD BLK. MFD210: MOV (R4)+,(R1)+ DEC R3 ;MFD2 COMPLETE? BNE MFD210 ;NO..KEEP LOOPING. MFD220: MOV R2,R1 ;ARGUMENT BLOCK NO FOR OUTPUT. JSR PC,OUTPUT JSRV R2,RBFLAG ;SET THE RUBOUT FLAG GETI11: MOVB -(R0),R2 ;GET THE CHARACTER PREVIOUSLY TYPED BR GETI03 ;AND ECHO IT GETI08: MOV R1,R0 ;FOR ^U, RESET TO START OF LINE JSR PC,INICTL ;EMPTY BUFFER- ECHO ^U BR GETI01 ;AND CONTINUE GETI04: JSR PC,INICR ;ECHO A CRLF BR GETI01 ;AND WAIT GETI09: JSR PC,INICTL ;ECHO HIS ^C JMP COMCON ;AND BACK TO COMCON GETI05: CMP R0,R1 ;IGNORE LEADING SPACES--IS THIS A LEADING SPACE? BEQ GETI03 ;YES-IGNORE IT BR GETI06 ;NO-PRESERVE IT GETI07: MOAVE SOME REGISTERS MOV R0,-(SP) ;TO WORK WITH MOV BUFADR,R1 ;SET UP FOR THE MOVE OF THE DATA ADD R2,R1 ;SET UP THE OFFSET ADD R2,R1 ;DO IT TWICE FOR BYTE ADDRESSING MOV FRMTBA,R0 ;SET UP THE ADDRESS OF THE INCOMING DATA MOV R4,-(SP) ;SAVE THE COUNT ON THE STACK CMP R4,TOFRSZ ;CONTIGUOUS? BNE FRO27 ;YES - ALL IS WELL INC R0 ;NO - PASS THE LINK WORD INC R0 FRO27: MOV (R0)+,(R1)+ ;MOVE A WORD INC R2 ;COUNT IT CMP R2,#400 ;BUFFER FULL? BGE FRO30 ;YES - WRITE IT OUT FRO28: DEa,7( $ E5ɕ 5P0ɕe JTW5@P V U5Pa  Œ% aeM *>B+X * ߕRM  Hɕ5"PwWa"wɕ .5P*E   qɕ ɕ 5"P 7 (T3 BAPP5aU5U5"U5@UEPs  ~1 6 2 . w$^ &RRE@P55 PC,ZERO ;CLEAR OUT DATA BLOCK. .SBTTL UFD -WRITE UFD # 1. ; ;WRITE FIRST UFD BLOCK ; ;THE MFD'S UFD'S, AND BIT MAPS ARE WRITTEN AFTER ;THE DISK HAS BEEN ZEROED. THE SECOND UFD ;THEREFORE, IS GUARANTEED TO BE ZERO. ; UFD100: MOV @SP,R1 ;SET TO TOP OF BODYBLOCK. MOV #UFDBK2,(R1)+ ;PTR TO NEXT UFD BLOCK. MOV #OUTFIL,R2 ;MONITOR'S FILE NAME. MOV (R2)+,(R1)+ ;1. 1ST 3 CHARS; MOV (R2)+,(R1)+ ;2. 2ND 3 CHARS MOV (R2)+,(R1)+ ;3. EXTENSION. MOVB R2,(R0) ;STORE THE CHARACTER MOV R1,R0 ;R0 POINTS TO START OF STRING JSR PC,INICR ;OUTPUT A RTS R5 ;RETURN INICTL: ADD #100,R2 ;CONVERT CONTROL CHAR TO PRINTING CHAR MOV R2,-(SP) ;SAVE IT FOR NOW MOV #'^,R2 ;AND TYPE THE ^ JSR PC,INIOUT ;TYPER MOV (SP)+,R2 ;NOW THE CHARACTER JSR PC,INIOUT ;ECHO IT BR INICR ;TYPE THE AND EXIT ;ROUTINE TO INITIALIZE EVERYTHING INI: CLR R0 ;LOAD INITIAL VECTORS MOV #137,(R0)+ ;SET UP RESTART ADDR (0) MOV #START,(R0)+ MOV C R4 ;NO - COUNT DOWN ON THE BUFFER BGT FRO27 ;CYCLE ON UNTIL DONE MOV (SP)+,R4 ;RESET THE REGISTERS THAT WE SAVED MOV (SP)+,R0 MOV (SP)+,R1 TST FRMTBB ;MORE IN THE FILE? BNE FRO20 ;YES - READ IT JSR PC,FRO31 ;WRITE OUT THE LAST RECORD JMP FRO40 ;AND FINISH UP FRO30: JSR PC,FRO31 ;WRITE THE RECORD OUT MOV BUFADR,R1 ;SET UP THE BASE OF THE MAGTAPE BUFFER CLR R2 ;AGAIN AND START REFILLING IT BR FRO28 ; FRO31: MOV R2,TOFRTW ;SET UP THE MAGTAPE TRANSFER WORD COUNT .TRAN #MTLB,af5ɕ &M 585 U ѐB`Ѱ `L7 & ahhE6 w7 l Õ7 p  7 Hwr wb7 *CW Հa |7 7  B߳tՀߕ@t97 D672G7 FՀ  %& n (a  7 Nߓp2|߳t&^  #ʔ `Z 7 & 7 2 ~V CDATE,@R1 ;4. CREATION DATE FROM CIL LINE BIS #100000,(R1)+ ;4. CONTIGUOUS FILE FLAG ; ****************************************** ; ; NEW FILE STRUCTURE !! ; MOV DOSSIZ,@R1 ;LAST BYTE=BLOCK SIZE(BYTES). ASL (R1)+ ; ; ************************************************** ; MOV FB,(R1)+ ;6. FIRST BLOCK RESERVED. MOV BLOCKS,@R1 ;7. # OF BLOCKS RESERVED MOV (R1)+,@R1 ADD FB,@R1 ;8. LAST BLK # = # OF BLKS+FB-1 DEC (R1)+ ;--- TRUE LAST BLOCK #. MOV #PRCODE,(R1)+ ;9. PROTECTION C#ST2,(R0)+ ;SET UP TRAP VECTOR FOR ILL MEM REF MOV #7*40,(R0) MOV #100000,R0 ;TRY FOR A 16K BUFFER FIRST BR ST3 ;ENTER TEST LOOP ST2: CMP (SP)+,(SP)+ ;CLEAR TRAP GARBAGE OFF STACK CLC ;DON'T ROTATE BIT IN ROR R0 ;TRY A SMALLER BUFFER THIS TIME ST3: TST BUF-2(R0) ;FIND OUT IF THE LAST WORD IS THERE SWAB R0 ;IT IS NOW FOR SURE ,DIVIDE BY 256. ASR R0 ;DIVIDE BY 512 BYTES MOV R0,BUFSIZ ;STORE BUFFER SIZE IN BLOCKS MOV #-1,R2 ;DTABL INITIALIZED TO 16 BYTES ALL NEGATIVE MOV #DTABL,R#TOFRTB ;AND WRITE THE BUFFER OUT .WAIT #MTLB RTS PC ;RETURN ; FRMUDS: .WORD 0 ;UFD ENTRY SIZE STORED HERE ; FRMTBB: .WORD 0 ;.TRAN BLOCK FOR THE DISK INPUT FRMTBA: .WORD 0 FRMTBS: .WORD 0 .WORD 5,0 ;READ IN BINARY .SBTTL *** MISCELLANEOUS SUBROUTINES ; ; ; RADIX 50 TO/FROM ASCII CONVERSION ROUTINES: ; ; "ASCRAD" - CONVERT THE THREE CHARS IN "RAD501", "RAD502", AND "RAD503" TO ; A RADIX 50 VALUE IN R4. IF THE STANDARD EXIT IS TAKEN, IT ; INDICATES AN ERROR IN CONVERSION. IF A Ra$^ 55  @@ 5  J &^ xty uEW! a 3W! W! RW!` SA9 ,݃˕w$" 2 W! ( קx ӕ קaW!5㨣 h 7 קx 7 zwH7{fwroa7dJ 7D5  e, 5ODE MOV #UFDBK1,R1 ;1ST UFD BLOCK# JSR PC,OUTPUT JSR PC,ZERO ; ;NO FURTHER REFERENCES TO UFD'S ARE REQUIRED. .SBTTL BMAP -WRITE ALL MAPS EXCEPT LAST. ; ;WRITE THE BIT MAPS ; ;THE ASSUMPTION IS MADE HERE THAT THE # MONITOR BLOCKS ;REQUIRED DOES NOT EXCEED 960. (ONLY 1 MAP IS ;CONSIDERED FOR UPDATE [BITS SET] ). ; BMAP00: MOV @SP,R1 ;SET TO TOP OF BLOCK MOV BLOCKS,R2 ;#OF BITS TO SET. ADD #4,R2 ;SET BLKS 0,1,2,3 AS WELL. ADD #10,R1 ;PT TO 0 ;THATS REALLY 8 WORDS MOV #8.,R1 INI0: MOV R2,(R0)+ DEC R1 BGT INI0 CLR NUM ;CLEAR SO /NUMBER OVERRIDES /DISK CLR NUM+2 ; MOV #1,DISKS ;# DISKS = 1 CLR LABEL ;LABEL = 0 FOR NORMAL PROCESSING, -1 OTHERWISE CLR TRACK ;FIRST TRACK TO READ/WRITE CLR TRACK+2 ; CLR FLAGS ;NOTHING SEEN IN SCAN (YET) CLR ILB0 ;INITIAL BLOCK TO READ CLR ILB0+2 ; CLR OLB0 ;INITIAL BLOCK TO WRITE CLR OLB0+2 ; CLR MTRWD ;CLEAR MAGTAPE FLAG CLR MTSKIP ;CLEAR MAGTAPE SKIP COUNT CLR MTDATETURN IS MADE AT TWO ; MORE THAN THE STANDARD, IT INDICATES THAT ALL WENT WELL. ; ; CALLING SEQUENCE: ; (RAD501,RAD502,AND RAD503 ARE SET UP) ; JSR PC,ASCRAD ; BR ERROR ;ERROR RETURN ; (INST) ;NORMAL RETURN - RESULT IN R0 ; ASCRAD: .RADPK #RAD501 ;LET DOS DO THE WORK MOV (SP)+,R4 ;MOVE THE VALUE INTO R4 BCS ASCRER ;IF AN ERROR OCCURED, USE DIFFERENT RETURN ADD #2,2(SP) ;INCREMENT THE RETURN ADDRESS ASCRER: TST (SP)+ ;POP THE ADDRESS FROM THE STACK RTS PC ;DONE - RETURN ; ; ; "RADa  G HW#JO HffA!N ,lHV  L w&e:'7, 0ߓp |   aw\7 7 &e # `%TI%NE%LOU   w6U   e,A>a<e  LfNUMe  x @n  `  e B & NN`ee cf cfcc$a$Bc   5   < ef  e $     X] 4 4 0 % L FIRST 16 BITS. BMAP10: SUB #16.,R2 ;SHOULD ALL BITS BE SET? BMI BMAP20 ;NO..IF NEG. COM (R1)+ ;YES..SET 16 BLKS BUSY BR BMAP10 ;KEEP LOOPING. BMAP20: BEQ BMAP40 ;ANY REMAINDER? ADD #16.,R2 ;YES..SET REMAINING BITS MOV #000001,R5 ;START AT BIT 0 AND BMAP25: BIS R5,@R1 ;MOVE LEFT TO RIGHT ASL R5 ;NO..MOVE LEFT. DEC R2 ;ALL BITS IN REMAIN SET? BNE BMAP25 ;KEEP LOOPING. ;THE FIRST BIT MAP HAS ALL THE BITS SET NEEDED TO ;DESCRIBE BLOCKS E ;INITIALIZE DATE CLR MTFIND ;INITIALIZE FIND FLAG CLR V4A ;INITIALIZE V4A FLAG CLR PFMT ;CLEAR PACK FORMAT FLAG CLR VERIFY ;INITIALIZE VERIFY FLAG MOV #-1,MCOPYX ;TURN OFF MAGTAPE COPY FLAG MOV #1,MTREEL ;INITIALIZE MAGTAPE REEL NUMBER .PAGE ;DETERMINE IF WE HAVE AN RF OR RC DISK INI3: MOV #INI2,@#4 ;STORE TRAP TO INI2 .IF NDF,DDCDAR TST @#RFDAE ;TRAP IF NO RF .IFF TST @#DDCDAR .IFTF MOV #RFDAE,DSKDAE ;SET UP POINTER TO EX. ADDR .IFT MOV #256.,TRACKS ;NUMBER OF TRACASC" - CONVERT THE RADIX 50 VALUE IN R0 TO THREE ASCII CHARACTERS ; (THE UNUSED RADIX 50 VALUE OF 35 WILL BE SET TO A "/") ; ; CALLING SEQUENCE: ; (R0 CONTAINS THE RADIX 50 VALUE) ; JSR PC,RADASC ; (INST) ;RETURN - RAD501,RAD502,AND RAD503 CONTAIN THE THREE ; ; ASCII CHARACTERS ; ; RADASC: .RADUP #RAD501,R0 ;UNPACK THE WORD IN R0 TO ASCII FROM RAD50 BCC RADART ;IF NO ERRORS, RETURN CMPB #':,RAD501 ;DO WE HAVE AN INVALID NUMBER? BNE RADART ;NO, JUST ONE CHAR IS NO GOOD MOVB #':,RAD5aU@& Ne eYыW W & ee we D f#>"7W!4Ja,, " U@W7 % 0p * e04 wH&&    UEa 0$&& `̵@ Jwff Je@ ŌD((IJ va  U%  v  E7   7      dU&&7 E ew4 0-3 (BOOT,MFD1,UFD1,+UFD2) AND THE ;REQUIRED (OR RESERVED) NUMBER OF BLOCKS FOR THE ;MONITOR CIL ABOUT TO CREATED. ; ;THE REST OF THE FIRST MAP STILL NEEDS TO BE FILLED ;IN (WORDS 0,1,2,3). ; WORD 0 = LINK TO NEXT MAP. ; WORD 1 = MAP #. ; WORD 2 = # OF WORDS OF MAP. ; WORD 3 = LINK TO 1ST MAP BLOCK. ; ; BMAP40: CLR R0 ;MAP# FOR WORD 1. MOV BM.MAP,R5 ;# OF MAPS. MOV BM.STR,R1 ;1ST BIT MAP BLOCK. MOV R1,R4 ;SET FOR LOOP. BMAP50: MOV @SP,R2 ;SET TO TO OF DATA BUFFER. INC R0 ;MAP KS ON ONE DISK .IFF MOV #4000,TRACKS ;***** NUMBER OF 1K TRACKS ON DEVICE .ENDC INI4: MOV #NXD,@#4 ;SET UP NON-EXISTANT DEVICE ERROR RTS PC ;ALL INTIALIZED ;INIT FOR RC11 ASSUMED INI2: CMP (SP)+,(SP)+ ;FLUSH TRAP GARBAGE OFF STACK MAKERC: CLR DSKDAE ;SET TO SHOW THAT ITS AN RC11 MOV #4000,TRACKS ;1024K ON ONE PLATTER BR INI4 ATOI: CLR R2 ;CLEAR RESULT REGISTERS CLR R3 ;DOUBLE PRECISION FOR BIG DISKS ATOI1: MOVB (R0)+,R4 ;GET DIGIT SUB #'0,R4 ;CONVERT TO BINARY BMI ATOI2 ;NOT02 ;YES, SET THE OTHER TWO TO ":" MOVB #':,RAD503 ;DONE RADART: RTS PC ;EXIT ; ; ; STOREAGE FOR THE FUNCTIONS: ; RAD501: .BYTE 0 RAD502: .BYTE 0 RAD503: .BYTE 0 .EVEN ; ; ; ; "NUMOUT" - CREATES AN ASCII STRING OUT OF THE UNSIGNED NUMBER IN R1 ; ; CALLING SEQUENCE: ; (R1 CONTAINS THE NUMBER) ; (R0 POINTS TO THE BEGINNING OF A SIX BYTE AREA FOR THE CHARACTERS) ; JSR R5,NUMOUT ; .WORD BASE ;"BASE" = NUMBER BASE THE CHARACTER IS TO BE OUTPUT IN ; (INST) ;RETURN HERE ; NUMOUT: MOV RZ5 P Œ% aeM .BF/\ 2 VRRN  Iɕ5"P<wF&M e v a( I D | j   X E eaE& & EfIDDm< & e#  E   eDbeA LA   ! 0  x$"x"7E  bwwww~"E8b$^ B ` RP #. MOV R4,@R2 ;BUILD WORD 1. ADD R0,(R2)+ ;WORD 0 =LINK TO NEXT MAP. MOV R0,(R2)+ ;WORD 1 =BIT MAP SEQ #. MOV #60.,(R2)+ ;WORD 2 =WORDS IN MAP. MOV R4,@R2 ;WORD 3 =1ST BIT MAP BLK #. DEC R5 ;LAST MAP? BEQ BMAP60 ;YES..GO SET UP LAST BITS. JSR PC,OUTPUT ;NO..WRITE THIS BLK. JSR PC,ZERO INC R1 ;NEXT MAP NO. BR BMAP50 ;SET NEXT MAP. .SBTTL WRITE LAST BIT MAP. ; ;BUILD THE LAST BIT MAP ; ;THIS ALGORITHM ASSUMES THAT THE NUMBER OF BL A DIGIT - FIX R0 AND EXIT CMP R4,#'9-'0 ;IN RANGE? BGT ATOI2 ;NOPE, SO QUIT ASL R2 ;MULTIPLY OLD VALUE BY 10 ROL R3 ;(DOUBLE PRECISION) MOV R3,-(SP) ; MOV R2,-(SP) ; ASL R2 ; ROL R3 ; ASL R2 ; ROL R3 ; ADD (SP)+,R2 ; ADC R3 ; ADD (SP)+,R3 ; ADD R4,R2 ;AND ADD NEW DIGIT TO THAT PRODUCT ADC R3 ; BR ATOI1 ;CONTINUE ATOI2: DEC R0 ;MAKE IT POINT TO BADDY RTS PC ;AND RETURN REGSAV: MOV R4,-(SP) ;SAVE REGISTERS R0 - R5 MOV R3,-(SP) ; MOV R2,-(SP) ; MO1,-(SP) ;SET UP FOR THE EMT CALL MOV R0,-(SP) ;TO THE MONITOR CMP (R5)+,#10 ;OCTAL BASE? BEQ NUMOCT ;YES, HANDLE OCTAL NUMBER ;NO - ASSUME DECIMAL INC (SP) ;UP THE ADDRESS PAST THE FIRST CHARACTER MOVB #40,(R0) ;SET THE LEADING SPACE IN MOV #3,-(SP) ;AND SET THE DECIMAL TO ASCII CONVERSION FLAG BR NUMCNV ;GO CONVERT NUMOCT: MOV #5,-(SP) ;SET UP TO CONVERT OCTAL TO ASCIII NUMCNV: EMT 42 ;TELL DOS TO DO IT RTS R5 ;DONE ; ; ; ; "GETNUM" - PICKS UP CHARACTERS VIA "GETC" UNTIL Ax/DI`/PL`/RW/RE/SK/BO(/NO /HE/NUj/FI/DA2/VEV/WLN/FO ^& ыBwp`ɋVB`Gh  5 Pw 55U:704UU@ "  w & h 5.@0 70nӋ:! ! [[נAנZנ0נ9@  aW `߇  ww P  P weeeOCKS ;REMAINING TO BE SET IN THE LAST MAP IS ;AN MULTIPLE OF 16. (I.E. IF DISK SIZE IS 1024. ;THERE ARE 64. BLOCKS IN THE LAST MAP [64 IS A MULTIPLE ;OF 16.]). ; ;"BM.BYT" INDICATES THE NUMBER OF BYTES REQUIRED IN THE MAP. ;IF 64. BLOCKS ARE REPRESENTED HERE "BM.BYT" WOULD BE 8 ;(8 BYTES OF 8 BITS=64 BITS REQUIRED). ; ; BMAP60: MOV (SP)+,R2 ;SET TO WORD 0 OF BUFFER. MOV @R2,-(SP) ;USE AS LOOP TERMINATOR(LAST BK+1). CLR @R2 ;WORD 0=LINK TO NEXT MAP(NONE). ADD #06,R2 ;POINT TO 1ST 16 BITSV R1,-(SP) ; MOV R0,-(SP) ; MOV 12(SP),-(SP) ; RTS R5 ; REGRES: TST (SP)+ ;REGISTER RESTORE MOV (SP)+,R0 ; MOV (SP)+,R1 ; MOV (SP)+,R2 ; MOV (SP)+,R3 ; MOV (SP)+,R4 ; RTS R5 ; INFILL: MOV R0,-(SP) ;SAVE R0 MOV #I.FILL,R0 ;AND GET FILL LIST 1$: TSTB (R0) ;ANY IN LIST? BEQ 2$ ;NOPE CMPB R2,(R0)+ ;YES, CHECK FOR MATCH BEQ 3$ ;FOUND MATCH INC R0 ;NOPE, SKIP COUNT BR 1$ ;AND TRY AGAIN 3$: MOVB (R0),R0 ;GET FILL COUNT MOV R2,-(SP) ;SAVE CHAR CLR R2 ;AND CHANG NUMBER HAS BEEN CREATED. ; NUMERIC CHARACTERS ARE PICKED UNTIL A NON-NUMERIC CHARACTER IS FOUND. ; IF THE NON-NUMERIC CHARACTER IS A ".", THE NUMBER WILL BE TREATED AS ; A DECIMAL NUMBER, AND THE "." WILL BE BYPASSED. OTHERWISE, THE NEXT ; CHARACTER PICKED WILL BE THE DELIMITING CHARACTER. THE DELIMITER MAY ; BE A NUMERIC CHARACTER, IF MORE THAN SIX (6) SIGNIFICANT NUMERIC ; CHARACTERS ARE IN THE NUMBER. IF NO NUMERIC CHARACTERS CAN BE FOUND, ; THEN A DEFAULT VALUE OF ONE(1) WILL BE RETURNED. ; PwVp 02I'F7@`w dh4fm\& n HF`ߕ w ~K$( f&  # w PK M##wN  |'7w dh xf& 7 lhd X # %d#`#l C _### b  ΕP5 (0L! 0 Ha 7# ȝ5Pȕ Е Ee0v w \K. MOV #100000,R4 ;SET FOR LEFT TO RIGHT ADD BM.BYT,R2 ;TRUE LAST BYTE MOV R2,R3 ;SAVE FOR FILLER AT END. BMAP65: DEC @SP ;USE AS LOOP TERMINATIOR. BIS R4,@R3 ;SET BIT MAP BLOCK BUSY. CLC ;MAKE CERTAIN THAT CARRY IS CLEAR ROR R4 ;MOVE RIGHT. BCC BMAP66 ;16 BITS MOVED? ROR R4 ;YES..SET BIT 17 AGAIN. TST -(R3) ;GO BACK ONE WORD. BMAP66: CMP @SP,BM.STR ;AT 1ST MAP BLOCK? BHIS BMAP65 ;ALLOW FOR MFD2 ALSO. CMP (R2)+,(SP)+ ;R2=PTR PAST LAST TRUE WORD OF MAP. MOV BM.BYT,R5 ;#OFE TO NULL 4$: JSR PC,INIOUT ;SEND ONE DEC R0 ;MORE? BGT 4$ ;YEP MOV (SP)+,R2 ;NOPE, RESTORE CHAR 2$: MOV (SP)+,R0 ;RESTORE R0 RTS PC ;AND EXIT .CSECT I.FILL I.FILL: .BYTE 0,0 ;DUMMY FILL LIST .CSECT I.TKS I.TKS: .WORD 177560 I.TKB: .WORD 177562 I.TPS: .WORD 177564 I.TPB: .WORD 177566 .CSECT MESSAG .NLIST BEX HELPER: .ASCII %THE STANDARD COMMAND STRING FORMAT IS:% .BYTE 15,12,15,12 .ASCII % #DEV:[/FORMAT OPTION]HLЀ L(Ѐ4HLЀ!!F-FILE, REQUEST KILLED." .BYTE 15,12,0 ERREOT: .ASCII "TAPE FULL, TYPE M TO MOUNT ANOTHER REEL AND CONTINUE," .BYTE 15,12 .ASCII "ANYTHING ELSE TO ABORT REQUEST: " .BYTE 0 ERRMTS: .ASCII "SELECT ERROR ON MT" MTOKU: .BYTE 0 .ASCII ":" .BYTE 15,12,0 ERRMWL: .ASCII "MAGTAPE WRITE PROTECT ERROR." .BYTE 15,12,0 ERRMTF: .ASCII "FATAL MAGTAPE ERROR." .BYTE 15,12,0 ERRNXD: .ASCII "SPECIFIED DEVICE DOES NOT EXIST." .BYTE 15,12,0 ERREOD: .ASCII "REACHED END-OF-DATA ON SKIP, OPERATION KILLED" ; ; ; "MAKNAM" - PICKS UP A FILE NAME DELIMITED BY A SPACE OR TERMINATOR ; ; THIS ROUTINE WILL TAKE UP TO 10 CHARACTERS FROM THE BUFFER (VIA CALLS ; TO "GETC") AND CREATE A FILE NAME IN THE THREE WORDS POINTED TO BY ; R0. ; ; CALLING SEQUENCE: ; (R0 POINTS TO THE PLACE WHERE THE FILE NAME WILL GO) ; JSR PC,MAKNAM ;CALL ; BR ERROR ;RETURN IF NO FILE NAME CAN BE MADE ; (INST) ;NORMAL RETURN - R0 POINTS PAST THE FILE NAME ; MAKNAM: JSR PC,GETCNS ;GET THE FIRST CHARACTER OF THE FILE NAME C'LD6C`0^8KTDS( @șb;MBAl|@< b\SyO 'L8e`Α@rLNTlV r(HHM9ehJHL9eh=LTL͑@̘OY}@D@Έ 8M;eb͕H(}( J L8e`РL8e`А \8e`Κ9 BAL8e`ШHHM9ehJHL9eh,LTLРL8M;edh?DL8e`Α@@ Ct@TMU$ TDS( 8e`ΙMLC@H R4IZDX zHYT %[L8e`Α@) \Eh 8e`ΙAPS$O*C{&}k.[!scYk ]sΖK.[!\sM8Y«ܳS.Z!\sxckjHƒS.Z!܄sOwjk<(BغjąX?꟨?SjkΛjۣUV}hkΘ[!s&8Cejزr͒{䗣CcUۣ[!ۅs&-۷ٗ[Wr[[}[Z!܄s|wYj{{r}SjkΘ[!s jjۣ}ۣ[!s&wܳTK͐[!sp?jC}(bغt>ˍjčXjčXjąX%." .BYTE 15,12,0 MTEOF0: .ASCII "END-OF-FILE DURING READ, TYPE" .BYTE 0 BFN: .ASCII %MAGTAPE FILE NAME DOES NOT MATCH SPECIFIED NAME.% .BYTE 15,12,0 CNF: .ASCII %CAN'T FIND SPECIFIED FILE ON TAPE.% .BYTE 15,12,0 NFN: .ASCII %NO OUTPUT FILE NAME SPECIFIED.% .BYTE 15,12,0 MTARTL: .ASCII %MAGTAPE RECORD TOO LONG FOR BUFFER.% .BYTE 15,12,0 BADCHK: .ASCII %VERIFICATION ERROR--COPY IS BAD.% .BYTE 15,12,0 NOGO: .ASCII %/VERIFY IS NOT IMPLEMENTED FOR THIS COMMAND.% .BYTE 15,12,0 VPASS: .AS&MP R5,#12 ;IS IT A TERMINATOR? BEQ MAKMV3-2 ;YES - ERROR RETURN DEC R3 ;NO - BACK UP ONE NOW THAT THE SPACES ARE OVER JSR PC,MAKMV3 ;CONVERT THREE CHARACTERS JSR PC,MAKMV3 ;DO IT AGAIN MAKNLP: JSR PC,GETC ;GET A CHARACTER CMP R5,#'. ;IS THE DELIMITER A "."? BEQ MAKNLT ;YES, GO GET THE LAST THREE CMP R5,#12 ;IS IT A TERMINATOR? BNE MAKNLP ;NO - GET ANOTHER CHARACTER CLR (R0)+ ;ZERO THE EXTENSION IF A TERM. WAS FOUND BR MAKNEX ;EXIT MAKNLT: JSR PC,MAKMV3 ;MAKE THE EXTENSION MA5HMChLHLTKLQk^Ht@dkT D-U^@HLFLTÆJbhLHLTK )LFmݩLr L&Cb1^Ht@k@0Z< 1LLHLTKLHLTKLHtԑ F Ӛ@EHt@ɜh^@HLF dLTÆJbJU"YLHLTK )LFmݩLrDLTXMDAKGJA.x0)}L zZ\ $ ) E.x$S LTÆJdh9ML$.p._LTHLlhHL$6аq&$.s ޖLk zZ@EH R4OiΑ( RTTA SND.E ; ;N AIAG ; 0RDWO .L:CFIR DR TEUNCO ; 0RDWO .K:CBIR DN VE.E ) NDMAOM CMPDUR FO (DEMOT PUUT ONTREUR;C0 E YT.B: DEMO EDCTPEEXY ITAR PNTREUR;C0 E YT.B: TYRIPA NSIOATEROPT ENRRCUR FOR TOCADIINY ITNSDE ; 0TEBY .K:TREN D; ;S LEABRIVA* **L TTSB . N VE.E . M=NBRO F2 ,1125, 1TEBY . E'ACSPR FEUF BGHOUENT NO* **** 'IISC.A 2 ,115E YT.B 6 E-NBRO-FBM)CII %STARTING VERIFICATION PASS.% .BYTE 15,12,0 FMTENB: .ASCII /SET FORMAT ENABLING SWITCHES THEN TYPE CR / .BYTE 0 FMTDSB: .ASCII /DISABLE FORMAT SWITCHES THEN TYPE CR / .BYTE 0 FMTBGN: .ASCII /STARTING RK FORMAT PASS/ .BYTE 15,12,0 FMTEND: .ASCII /END RK FORMAT PASS/ .BYTE 15,12,0 FMKILL: .ASCII /REQUEST KILLED/ .BYTE 15,12,0 FMTERR: .ASCII /ERROR DURING FORMAT PASS - RESTART/ .BYTE 15,12,0 FMTRDI: .ASCII /DISK NOT READY - TYPE CR TO TRY FORMAT AGAIN / .BYTE 0 .EVEN ;I/O BUFFE*KNEX: ADD #2,(SP) ;UP THE RETURN ADDRESS RTS PC ;AND EXIT MAKMV3: MOV #3,COUNT ;SET UP A COUNTER MOV #RAD501,POINT ;AND A POINTER MAKMVL: JSR PC,GETC ;GET A CHARACTER CMP R5,#'. ;IS IT A "."? BEQ MAKMVE ;YES - EXCEPTIONAL CHARACTER CMP R5,#12 ;TERMINATOR? BNE MAKMOV ;NO MOV #40,R5 ;YES, CHANGE IT TO A SPACE MAKMOV: MOVB R5,@POINT ;MOVE IT IN INC POINT ;UP THE POINTER DEC COUNT ;COUNT DOWN BNE MAKMVL ;CYCLE ON THROUGH UNTIL DONE JSR PC,ASCRAD ;CONVERT THE ASCII BR MAKM[{߳}S۪ZYrΞ_y[ܢzYsjsEīs_S{]bU[/rٲWj}^}e߲EdC}X__켌Yrΐ_b&?Y_N.?rTrYobݐZYrΞ_k1[_[_r}Z[]}V}/[kjīs_cQYrΞ_?}rJ}KWYrΐ_brTrT[jRE֝Y_Nǂ\_CTrҪTcPZYrΞ_!wYrΞ_?}rJ}KWYrΐ_bk6{C}jXZཝY_NDms]rCkkCZYrΞ_f7ONFR0,6,.-M-NBRO FE:NBRO FN VE.E . M=NFRO F2 ,1125, 1TEBY . !'ESIL FNO' I CIAS . 125, 1TEBY . -6FEONFRM-NFRO,F,0-6-.FMONFR: FEONFR ENEV . =.EEFRTO 122,,115E YT.B ' RTBO A-- -ERSFANTRN IORRR E****'*I CIAS . 125, 1TEBY . -6ERFRTOE-REOF,T,0-6-.EEFRTO: ERFRTO ;N VE.E . E=SYLL I2 ,115E YT.B ' AXNTSYL GALEIL^ ^^ 'IISC.A 2 ,115E YT.B 6 M-SYLL-IYELSIL0,6,.-E-SYLL IM:SYLL I; ENEV . =.SENMFI 125, 1TEBY . ]'NN,NNN'NI CIAS .S:MSIN F' [ISC UI 'IISC.A 2 ,115E YT.B 6 G-MSIN-FSENMFI0,6,.-E-MSINR DEFINITIONS BUF1 =. ;DECTAPE (MAGTAPE) LABEL BUFFER KBUF =BUF1+1000 ;KEYBOARD INPUT BUFFER BUF =KBUF+1000 ;START OF MAIN I/O BUFFER O.EXIT = START .GLOBL O.EXIT .END START ;AUTO START .ER ;ERROR - DO THE STUFF MOV R4,(R0)+ ;MOVE THE STUFF IN RTS PC ;AND EXIT MAKMVE: DEC R3 ;BACK UP SO THE "." WILL APPEAR AGAIN BR MAKMOV-4 ;CHANGE THE "." TO A SPACE MAKMER: TST (SP)+ ;POP THE RETURN ADDRESS FROM THE STACK RTS PC ;AND TAKE THE ERROR RETURN FOR "MAKNAM" COUNT: .WORD 0 POINT: .WORD 0 ;SCRATCH LOCATIONS .SBTTL *** LINK BLOCKS, FILE BLOCKS, AND THE TRAN BLOCK ; ; ; COMMAND INPUT LINK BLOCK: ; 0 ;NO ERROR RECOVERY CMILB: 0 .RAD50 /CMI/ ;LOGICAL NAME .WORD 1 ;ONEHL@)ИrLhA9MB d.L@v`H h gHM@)ϕH }L@*p JPA RTAhМLT^ XLY@mPKHL@)J*O[Ih~L@ eI0HL@)И1+L@)h `4*ɘpA Sh *MB(} @RXFА HL@(А)ϙLdL@(SHrHL@JOРpL@*ΕH9,$}S}S8t: ,hT9MAJpBf(SHM Dќ^yLO *A E"S}^IxrLhRL@Dc`0JT@XI7b=Hm9MA0?\_ssWCM}-ZYrΞ_;E_}eWrTYrΞ_ܷ|k{kP۫nrMļwཝY_NԷy[j_ZCCZYrΞ_[t_rٲӫÃn.[S_*ZCOokC{r_[{߳}ck.[s_!rjMZcnE֫s_kۑsj`l?غrrZC\\<YKNCCKZCOr'.[t_rٲcw[r_]JD]j}޲}Cr[kr{_Ed"[QsRC} [﫫ën«U[/kRE$T FG:MSIN F; ENEV . =.OENNFI 125, 1TEBY . D'UNFOT NOS WAE IL'FI CIAS . 125, 1TEBY . -6OFNNFIE-NOIN,F,0-6-.OENNFI: OFNNFI ;N VE.E . E=MSIR D4 ,115E YT.B ' KSOCBLN NNNNN IESIL FNNNN N* ** 'IISC.A: SSRMDI 125, 1TEBY . -6SGRMDIE-MSIR D 0 -6-.SERMDI: SGRMDI ENEV . =.REREDI 125, 1TEBY . E'APGTMAD RETUUCTR SOS-DON NLEIBSSPO* ** 'IISC.A 2 ,115E YT.B 6 M-ERIR-DREREDI 0 6 .-E-ERIR DM:ERIR DN VE.E . E=TTIR D2 ,1125, 1TEBY . G'INSTLIY ORCTREDIE APGTMA' I CIAS . 14E YT.B 6 L-TTIR-DTERTDI 2 WORD FOLLOWS .RAD50 /KB/ ;DEFAULT TO THE KEYBOARD ; ; ; COMMAND OUTPUT LINK BLOCK ; 0 CMOLB: 0 .RAD50 /CMO/ .WORD 1 .RAD50 /KB/ ; ; ; OUTPUT DUMP FILE LINK BLOCK ; 0 OUTLB: 0 .RAD50 /OUT/ .WORD 1 OUTDEV: .RAD50 /LP/ ;THIS IS DYNAMICLY CHANGED ; ; ; MAGTAPE LINK BLOCK ; 0 MTLB: 0 .RAD50 /MTI/ .BYTE 1 ;ONE WORD FOLLOWS RUNUNT: .BYTE 0 ;UNIT NUMBER OF THE MAGTAPE .RAD50 /MT/ ;DEFAULT DEVICE IS THE MAGTAPE ; ; ; ; COMMAND INPUT FILE BLOCK ; 004 ;FOR INPUT CMIϋw8x ڠٺ罟罋㽟㽋罟罋L??x ׋?罟罋z`׋ܴ?y ߋݼ?C?B?M?fϋuN;?NjWQzO]b TUzN?}c{dRsDrÅz'kByk6ss'jPE&Cz'߳}*cܐrd/k.[L[zMw8ze?st꟨e?}_*Ӑez_ZCRk.Z ۣKzwѪz'_*֤{j[Sz_ *ӅjXZ罋^_0?jL@)h "Y|@Dd|PZ  Z}I((ϩL@Љ-JElA*AMQ$ -Y|@Dd@EQt)ϙM B^)4I(@KL@M*h (IhA R d*ב|OU~HLRJEX@)5@DD$)LY.؈M@Զr}LT OРKGJA }O:- }9e)L@JWH *@ƈ-A9MwCL@(ӑ5-ZTXuIu@.q9|H) @D-@dLNd4L@v`JAKMY}Tp-H,HL@(hӁKL@M(Ј| L@(АuOL@Dc50 6 .-E-TTIR DL:TTIR DN VE.E . E=E6UM D2 ,1125, 1TEBY . D'TEAL HAS WMPDU 'IISC.A 2 ,115E YT.B ' LEFIF--OND EANS WAD EA RRDCORE* **** 'IISC.A 2 ,115E YT.B 6 6-MEUM-D6EMEDU 0 6 .-E-E6UM D6:MEUM D; OF EANS WAD EA RRDCOREE THT HA TERUSE THL EL TTOE AGSSME; ;; 15502,0,2,D OR.W: E5MMDU ;E AGSSMED EE FNELI; ;; ENEV . =.4EMEDU 125, 1TEBY . 8'8888 8 'IISC.A ' 7777776 6666 65555554 4444 43333332 2222 2111111 000000 'IISC.A: E3MMDU -6E4MMDUE-E4UM D 0 -6-.4EMEDU: E4MMDU ;D AN6FB: .RAD50 /MTDUMP/ .RAD50 /INP/ ;NAME IS "MTDUMP.INP" .WORD 0,0 ;WITH THE CURRENT PROJ,PROG NUMBER ; ; ; COMMAND OUTPUT FILE BLOCK ; 002 ;FOR OUTPUT CMOFB: .RAD50 /MTDUMP/ .RAD50 /OUT/ ;NAME IS "MTDUMP.OUT" .WORD 0,0 ; ; ; OUTPUT DUMP FILE BLOCK ; 002 ;FOR OUTPUT OUTFB: .RAD50 /MTDUMP/ .RAD50 /DMP/ ;IF NO NAME GIVEN, DEFAULT IS "MTDUMP.DMP" .WORD 0,0 ; ; ; ; MAGTAPE TRAN BLOCK ; MTRNBK: 0 ;BLOCK NUMBER 0 BUFADR: 160000 ;BUFFER ADDRESS GETS SET HERE FROM INIT PROCE= xML1.xdbĘK֢HLHe͑@IHyҙ ,@.IQ<L(ȇ^DMA(%hHLDlJE(@Ԛ@SDA"3HMHe͑@H H (} z@ J$EИ+LLTL1^(䔞T8Lh.xKGJA/J}9Ydڬ *OE 08|L-QxMLЀ.x -9d8LЀe9LHTtCm :dOhZHMC^@D|zILTLϑ@ZU r@OLttPz|Ah.xZ*-OԑHD-.9@DOI 8/CuZs[Sz_ܿ]}_3ْCңkP[Uz_Yj[kP[Ѫz'_*NQ}K]b[]}_쬧?VjT{\K.[=]}J_z*CCk[[z_*n[t_.¬}_* 8߳}{}XZez_Y:Zz_*ýZrߣkbQCDKW۽ز[z'_qw+r[}O]bZ_z_*wo?{sh_߃?z'_z'_ ^_z'_$Uz_Vr)c˟^_KZs.[=}KzMMCOP UM DOR FERFFBUT PUUT O ;; ;N VE.E . E=E1UM D2 ,1125, 1TEBY . S'RDWO. 000000 'IISC.A: E2MMDU 'H:GTEN LRDCORE 'IISC.A 2 ,115E YT.B 6 1-MEUM-D1EMEDU 0 6 .-E-E1UM D1:MEUM D; AS WRDCOREE THG ON LOW HERUSE THL EL TTOE AGSSME; ;; ENEV . =.MEMEDU 125, 1TEBY . .'RDCOREG ON LLEIBSSPO- R ROERT PUIN* **** 'IISC.A 2 ,1125, 1TEBY . -6MSMEDUE-EMUM D 0 -6-.MEMEDU: MSMEDU ;R ROERD EA RLEIBSSPOA F OERUSE THG INLLTEE AGSSME; ;; ENEV . =.MECOIL 125, 1TEBY . D'ANMMCOL GALEIL^ ^^ 'II:DURE BUFSIZ: 0 ;SIZE OF THE BUFFER SET HERE DURIBG INIT .BYTE 5 ;INPUT IN BINARY TRNSTA: .BYTE 0 ;STATUS OF THE TRANSFER TRNWC: 0 ;REMAINDER OF THE WORD COUNT WHEN DONE ; ; ; THE SPECIAL FUNCTIONS BLOCK ; SFBLK: .BYTE 0 ;CODE FOR THE FUNCTION .BYTE 3 ;WORDS TO FOLLOW SFBSTA: .WORD 0 ;STATUS RETURNED SFBINF: .WORD 0 ;INFORMATION PASSED SFBRET: .WORD 0 ;RESIDUE COUNT RETURNED .SBTTL *** CANNED MESSAGES AND BUFFERS ; ; TITLE MESSAGE ; TITLE: ETITL-.-6 ;MAX NUMBER OF BYTES .WOR\l[ LTÆJdh9MLZ4UА`LZ4TЀLThL1LcJITdD֚@)uH-@@t Z}I(:}Z}I *@O8@4 t جEh-\I  H\ՙMGР 8M@FC :}A(L@\Р 8M@C(}}LTйD1 [8M@CJh5LTйLD1L\I HL@\ȑh uvL@DC 8M@fC 9MLtР1L@\А\*MR\*MRHLJ%MЈML\h2HL\АjLJ%MЈtգ <\LDqC^@F-RYt)heHL9d͕H(},O) h V(M̕HjА ݝMT҅JS|dh HLTÅJS|dhϦL9d͕H9 Xd"$}N(lc9LL ]y*MRH :-(\*MR yMCh6^8D@I):FHL*-MLӚE٭ZLR1- r-[tIJР.x zY*@XRIIͨTDM8yO*Z@hz@ @ 4L4T *MKh.xEЀTLKϑD-UIJULI,TIh xH^ZTMQ$L!k`HMTKMh=SC.A 2 ,115E YT.B 6 M-OMLC-IMECOIL L MAOR NIISC AEDTTMAOR;F 0 -6-.MECOIL: MMCOIL ;D ANMMCOL GALEILN AOFR SE UHE TNGLIEL TGESAES M ;; ;N VE.E B TAL CATIER V ATHWID EN ;13E YT.B ' '>I CIAS . 152, 1TEBY . 4. 0 . 10: MKSHHA ;D RETEENE BTOD ANMMCOA R FOY ADREN HE WUTTPOUO TRKMA; ;; ENPPHAO TNGHIYTANR FOH UGNO;E. 00+1=. . EDATEREP SND AADRED ANMMCOE THR FOR FEUF;B0 D OR.W: INMD C; ;E ACSPR FEUF BVEERES;R. 00+1 . = . E? BLLWIL UACT AHE TATWHS OWKNO WH ;. 00 1 ALRMNOI CIASD TEAT>D 0 ;FORMATTED ASCII NORMAL ETITL-TITLE-6 ;ACTUAL NUMBER OF BYTES .BYTE 15,12,12 .ASCII 'MTDUMP V001B' .BYTE 15,12,12 .ASCII 'WHAT IS THE OUTPUT DATA SET? ' .BYTE 13 ETITL=. .EVEN ; ; ; ; ERROR MESSAGE FOR BAD OUTPUT DEVICE ; MSOUTE: EMSOUT-.-6 0 ;FORMATTED ASCII NORMAL EMSOUT-MSOUTE-6 .BYTE 15,12 .ASCII ' ^^^ ERROR IN OUTPUT FILE SPECIFICATION' .BYTE 15,12 .ASCII ' OUTPUT DATA SET? ' .BYTE 13 EMSOUT=. .EVEN ; ; ; MESSAGE TELLING THE USER HOW MUCH BUFFER SPACE غ|{z'Zr䗓{r]KKCC'f_Kۢ[K?K_*X{[K_nRK_*pN?y^_?ّS_*GyPjr?Cu__*RK_*pN?{^_?ّS_*GyPk?~ѪK_*O[K_nWS_*dPWS_*dPWS_*dPWS_*dP|s]E֝_KC]_ZKZѪK_*+?c=_ &?C]_C۟z'_*m WS_*d2}cU}Wf׽KKNѪK_*FWS_*d2RK?LDvC`05LTйLD1{JITdD֚@)uHL: TttRIh.x + zRIu:Z}I(xMRAu 1+xXJUZ4 J$EИ3ѕxRZRNh.x• mI 5LTRAuyL@ mIР:HL@\I0L@kUHL@\hmKL@MR,` @XOР %u9mXhAhd+h4HL@\UЀLKL@M\ 9mXMFMm9MAL9mX 3r8M@FCWzhujL@8m0 58M@vC { L,CX ul8M@vC {@И˚LCX;RMFO ;0 S TEBY0 10S IAX;M 0.10: UFMBCO ;R FEUF BUTNP INDMAOM C ;; ;N VE.E . E=MERA T2 ,115E YT.B ' D.TEUNMOS IVERI DOFE YP TNGRO WHE T**'*I CIAS . 125, 1TEBY . -6ESAMTRE-MERA T 0 -6-.EEAMTR: ESAMTR ;E IVDRF OPETY; NGRO WHE TEDERNTOUNC ENDMAOM CK"ACTR "HE TATTHR SE UHE TLLTEO TGESAES M ;; ;N VE.E . E=MSEO W2 ,115E YT.B ' D.TELEMPCOT NOS ONTIRAPE O0.0000'0I CIAS .S:MEEO W' * ** 'IISC.A 2 ,115E YT.B 6 S-MSEO-WSEOMWE 0 6 .-E-MSEO WS:MSEO W; NDMAOM CLEFIIPSKR OE,ILKFAC BE,ACTHERE IS ; MSSIZ: EMSSIZ-MSSIZ-6 0 EMSSIZ-MSSIZ-6 .BYTE 15,12 .ASCII '*** BUFFER SIZE IS' MSSIZ1: .BYTE 0 .BYTE 0,0,0,0,0 .ASCII ' (10) BYTES.' .BYTE 15,12,12,12,12 EMSSIZ=. .EVEN ; ; ; ERROR MESSAGE THAT IS PRINTED WHEN AN ERROR OCCURS DURING A SPECIAL FUNCT. ; SPFERR: SPFERE-.-6 0 SPFERE-SPFERR-6 .BYTE 15,12 .ASCII '*** ERROR ON THE MT:' .BYTE 15,12 SPFERE=. ; ; ; MESSAGE TO TELL THE USER HOW MANY OPERATIONS WERE NOT COMPLETED DURING A ; WEOF, BACKSPACE, FORWARDSPܹ(әAҕК@Y*-Oha;MA|"L@&c^ ZO(ӛO RR^ ITHLT LE)@LII \h7(әM EA%^@Ch#:MBAlDL@)ϕ\䒞FZ [IpHM@(BhHL@(Bh L@v`0hxLTD D@LLDC$ PIpM@6cHLT DЀyL@(BH@l@EXO*SLT LE?L@Dfc m;MAŖL@)Օ֘dIʨI,@YZ.+L@fc |*$-O(-LL@(Р)X >