ttt*tһC! *q,(  0,&w. ޻7 $ 7 \.*& Ν["& ΝW",*S I B X p7*, T^ e r,PxYt :"ZV*v fi"fl"fp*"L CfEv *f; UPDATE 7/7/72 MAKE WHODER MORE GENERAL - HOWEVER, ;WHO ; OTHER DEVICES TO BE SCANNED MUST HAVE: ;WHO ; 1. 64 WORD BLOCKS ;WHO ; 2. MFD BLOCK #1 IN DEVICE BLOCK #1 ;WHO ; 3. BIT MAPS AT THE TOP ADDRESS OF ;WHO ; THE DEVICE. ;WHO ; 4. MUST ; UPDATE 7/12/72 FIX INC FREEB ;WHO ; UPDATE 7/7/72 MAKE WHODER MORE GENERAL - HOWEVER, ;WHO ; OTHER DEVICES TO BE SCANNED MUST HAVE: ;WHO ; 1. 64 WORD BLOCKS ;WHO ; 2. MFD BLOCK #1 IN DEVICE BLOCK #1 ;WHO ; 3. BIT MAPS AT THE TOP ADDRESS OF ;WHO ; THE D&((,6@^@C! 6 @^@",$q,t(  0,&wQ  tl0H j7 "f" wbwb*f"ע0ӕ f<*" f"  {** tHa X ý 1*NF"fb ( @*rC! \8HTZ V *&7B  ɕ0  , 0 5ѕ 5 5νm* f"R e@*-" ]* BE ASSIGNED TO WHODER VIA AN: ;WHO ; AS,DK:,DFG ;WHO .TITLE WHODER ;WHO ;PROGRAM TO LIST ALL FILES OF ALL UICS ON DISK AND TO ;WHO ;DISPLAY BIT MAPS ;WHO ; VERSION OF MAY 23,1971 ;WHO R0=%0 ;WHO EVICE. ;WHO ; 4. MUST BE ASSIGNED TO WHODER VIA AN: ;WHO ; AS,DK:,DFG ;WHO ; ;WHO .TITLE WHODER ;WHO ;PROGRAM TO LIST ALL FILES OF ALL UICS ON DISK AND TO ;WHO ;DISPLAY BIT MAPS ;WHO ;  $ 7  j(_,p& Ν"& Ν",{ ,S I B  p7U , T e rR  .xt :J"Z5V9J&50, f"f"fc&,&"L CfE d ,"   *P | w nGd̽` &,t0ƻ,MMܻ"@ N)ܼ DISK DIRECTORY c* UIC T FILNAM.EXT DATE *, MODE START DLONG LASTQ P PROt],a o. s f  Z R1=%1 ;WHO R2=%2 ;WHO R3=%3 ;WHO R4=%4 ;WHO R5=%5 ;WHO SP=%6 ;WHO PC=%7  VERSION OF MAY 23,1971 ;WHO R0=%0 ;WHO R1=%1 ;WHO R2=%2 ;WHO R3=%3 ;WHO R4=%4 ;WHO R5=%5  ",Jf"f" wbwb,nf "ע0ӕ f( $(k," f."  { ., tH X O "Ot,FJ"f5b (  J5:,C!l \8HTZ V   lu,"&7B   Q H @ 7 TOTAL BLOCKS e#ý ******* DISK MAP  = BLOCKS USED  BLOCKS FREE   *b|~#vtfdf&A,Z*"e," (*&&"f "*о >J&*zQQAA wL^Y ;WHO .CSECT ;WHO .PAGE ;WHO ; ;WHO ;INIT LINKS, FIND OUT WHAT DAY THIS IS, AND PRINT DIRECTORY MESSAGE ;WHO INIT: MOV #DFLINK,-(SP) ;WHO EMT 6 ;WHO MO ;WHO SP=%6 ;WHO PC=%7 ;WHO .CSECT ;WHO .PAGE ;WHO ; ;WHO ;INIT LINKS, FIND OUT WHAT DAY THIS IS, AND PRINT DIRECTORY MESSAGE ;WHO INIT: MOV ɕ0  , W .2F 5ѕ 5 5Z *Zg,p f"R e@N ,-"  H,w"   T  wh, | w nGdX` &@EX&@ .@60H66RN T% ) / tV #LPLINK,-(SP) ;WHO EMT 6 ;WHO MOV #LPFILE,-(SP) ; OPEN O ON THE LINE PRINTER ;WHO MOV #LPLINK,-(SP) ; THIS GIVES DEVICE INDEPENDENCE. ;WHO EMT 16 ;WHO MOV #103,-(SP) ;GET DATE AND LEAVE ON STACK ;WHO EMT 41  #DFLINK,-(SP) ;WHO EMT 6 ;WHO MOV #LPLINK,-(SP) ;WHO EMT 6 ;WHO MOV #LPFILE,-(SP) ; OPEN O ON THE LINE PRINTER ;WHO MOV #LPLINK,-(SP) ; THIS GIVES DEVICE INDEPENDENCE. ;WHO EMT 16 @6H6 6(R.&@@MMh_@ @(h$L@ N5  h}+h DISK DIRECTORY  Q, UIC T FILNAM.EXT DATE , MODE START DLONG LASTy PRO   ,  E .TITLE DK DKDR ; DKDR ; THIS IS THE GES DRIVER FOR THE DDC DISK TO BE USED BY DOS FOR EXTRA DKDR ; DISK STORAGE. IT IS NOT USED AS THE SYSTEM DEVICE. ALSO, THE DKDR ; FOLLOWING CONSIDERATIONS MUST BE ALLOWED FOR: DKDR ; DKDR ; 1. FOR MINIMUM CHANGES TO DOS, TH ;WHO MOV #TODAY,-(SP) ;BUFFER ADDRESS ;WHO JSR PC,JULMOV ;WHO MOV #161,LPHEAD+4 ;WHO MOV #DSKDIR,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO .PAGE ;WHO ;CONTROL LOOP FO ;WHO MOV #103,-(SP) ;GET DATE AND LEAVE ON STACK ;WHO EMT 41 ;WHO MOV #TODAY,-(SP) ;BUFFER ADDRESS ;WHO JSR PC,JULMOV ;WHO MOV #161,LPHEAD+4 ;WHO MOV #DSKDIR,LPHEAD+6 ;WHO JSR PC   .           x   o % % g . . ^ 44 TOTAL BLOCKS  O%O ******* DISK MAP % uo u d |h| BLOCKS UE DEVICE WILL BE CALLED 'DK'. DKDR ; 2. SINCE A DIFFERENT TRANSFER VECTOR (FROM DOS' DK) IS USED, DKDR ; THE DRIVER MUST SET UP ITS OWN. DKDR ; DKDR ; DEFINITIONS DKDR R0=%0 ; GENERAL REGISTERS DKDR R1=%1 ; DKDR R2=%2 R READING OF MFD ;WHO JSR PC,DFTRAN ;GET FIRST MFD BLOCK ;WHO MOV MFDBUF+4,MAPLNK ;LINK TO FIRST BIT MAP ;WHO NEWMFD: MOV MFDBUF,TRAN ;PICK UP NEXT LINK ;WHO BNE .+6 ;WHO JMP ALLOUT ;JUMP OUT IF NO MORE ;WHO JSR PC,DFTRAN ;READ NEW MFD ,LPRINT ;WHO .PAGE ;WHO ;CONTROL LOOP FOR READING OF MFD ;WHO JSR PC,DFTRAN ;GET FIRST MFD BLOCK ;WHO MOV MFDBUF+4,MAPLNK ;LINK TO FIRST BIT MAP ;WHO NEWMFD: MOV MFDBUF,TRAN ;PICK UP NEXT LINK ;WHO BNE .+6 SED  T BLOCKS FREE  @   ,|~vtfdf& -.Z"e" x (x,8&"f"[e,\ >J&),zQQAA wL^Y |! ; DKDR R3=%3 ; DKDR R4=%4 ; DKDR R5=%5 ; DKDR SP=%6 ; DKDR PC=%7 ; DKDR ; " ;WHO MOV #MFDBUF+2,R0 ;ADDRESS FIRST UIC ;WHO MOV #-17,R5 ; 15 UIC'S PER MFD BLOCK ;WHO NEWUIC: MOV (R0)+,CURUIC ;UIC ;WHO BNE UICLST ;IF NOT ZERO WE HAVE ONE ;WHO TST (R0)+ ;BYPASS POINTER ;WHO MORUIC: CMP (R0)+,(R0)+ ;ADVANCE ;WHO INC R5 # ;WHO JMP ALLOUT ;JUMP OUT IF NO MORE ;WHO JSR PC,DFTRAN ;READ NEW MFD ;WHO MOV #MFDBUF+2,R0 ;ADDRESS FIRST UIC ;WHO MOV #-17,R5 ; 15 UIC'S PER MFD BLOCK ;WHO NEWUIC: MOV (R0)+,CURUIC ;UIC ;WHO BNE UICLST ;IF NOT ZERO WE HAVE ONE ;WHO TST (R0)+ $ 4 2   .   (  %% DKDR ; DISK REGISTERS DKDR DCS =165300 ; DISK CONTROL STATUS REGISTER DKDR WC =165302 ; WORD COUNT REGISTER DKDR CMA =165304 ; CURRENT MEMORY ADDRESS REGISTER DKDR DAR =165306 ; DISK ADDRESS REGISTER DKDR DER =165310 ; DISK ERROR REGISTER DKDR DBR =165& ;PICK UP NEXT UIC IF ;WHO BMI NEWUIC ;THERE IS ONE ;WHO BR NEWMFD ;WHO .PAGE ;WHO ;CONTROL LOOP FOR EACH UIC ;WHO UICLST: CLR UICTOT ;RESET UIC BLOCK COUNTER ;WHO MOV #UFDBUF,TRAN+2 ;UFD HAS OWN BUFFER ' ;BYPASS POINTER ;WHO MORUIC: CMP (R0)+,(R0)+ ;ADVANCE ;WHO INC R5 ;PICK UP NEXT UIC IF ;WHO BMI NEWUIC ;THERE IS ONE ;WHO BR NEWMFD ;WHO .PAGE ;WHO ;CONTROL LOOP FOR EACH UIC )312 ; DATA BUFFER REGISTER DKDR MA =165314 ; MAINTENANCE REGISTER DKDR ADS =165316 ; DISK SECTOR ADDRESS REGISTER DKDR ; DKDR TV =530 ; INTERRUPT TRANSFER VECTOR DKDR INTPRT =240 ; PS FOR INTERRUPT DKDR ; * ;WHO CLR -(SP) ; CLEAR TOP OF STACK FOR BYTE. ** ;WHO MOVB CURUIC,(SP) ; PUT CURRENT UIC ON STACK TO DECODE ** ;WHO MOV #UICU-3,-(SP) ;WHO MOV #5,-(SP) ;WHO EMT 42 ;WHO CLR -(SP) ; CLEAR TOP OF STACK FOR BYTE. ** ;WHO MOVB CURUIC+1,(SP+ ;WHO UICLST: CLR UICTOT ;RESET UIC BLOCK COUNTER ;WHO MOV #UFDBUF,TRAN+2 ;UFD HAS OWN BUFFER ;WHO CLR -(SP) ; CLEAR TOP OF STACK FOR BYTE. ** ;WHO MOVB CURUIC,(SP) ; PUT CURRENT UIC ON STACK TO DECODE ** ;WHO MOV #UICU-3,-(SP) ;WHO MOV #5,-(SP) ;WHO EMT 42 ,; UPDATE 11/6/72 ; DK.S02 (NEW TRANSFER VECTOR) .TITLE DK DKDR ; DKDR ; THIS IS THE GES DRIVER FOR THE DDC DISK TO BE USED BY DOS FOR EXTRA DKDR ; DISK STORAGE. IT IS NOT USED AS THE SYSTEM DEVICE. ALSO, THE DKDR ; FOLLOWING CONSIDERATIONS MUST BE ALLOWED FOR: DKDR ; - DKDR MFDBLK =1 ; DISK ADDRESS OF MFD BLOCK #1. DKDR ; DKDR .PAGE DKDR .DEF DK ; DKDR ; STANDARD DRIVER TABLE DKDR DK: .WORD 0 ; CURRENT DDB ADDRESS & BUSY FLAG DKDR .WORD 10.) ; PUT GROUP # ON SATCK TO DECODE ** ;WHO MOV #UICG-3,-(SP) ;WHO MOV #5,-(SP) ;WHO EMT 42 ;WHO MOVB #54,UICU-1 ;WHO MOVB #12,UICG-1 ;WHO MOVB #12,UICG-2 / ;WHO CLR -(SP) ; CLEAR TOP OF STACK FOR BYTE. ** ;WHO MOVB CURUIC+1,(SP) ; PUT GROUP # ON SATCK TO DECODE ** ;WHO MOV #UICG-3,-(SP) ;WHO MOV #5,-(SP) ;WHO EMT 42 ;WHO MOVB #54,UICU-1 0 DKDR ; 1. FOR MINIMUM CHANGES TO DOS, THE DEVICE WILL BE CALLED 'DK'. DKDR ; 2. SINCE A DIFFERENT TRANSFER VECTOR (FROM DOS' DK) IS USED, DKDR ; THE DRIVER MUST SET UP ITS OWN. DKDR ; DKDR ; DEFINITIONS DKDR R0=%0 ; GENERAL REGISTERS DKDR R1=%1 10037 ; FACILITY INDICATOR: DKDR ; FILE STRUCTURED DKDR ; ASCII DEVICE DKDR ; BINARY DEVICE DKDR ; INPUT DEVICE DKDR ; OUTPUT DEVICE DKDR ; MULTIPLE USER DEVICE2 ;WHO MOV #11,LPHEAD+4 ;WHO MOV #UICG-2,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO MOV (R0)+,TRAN ;SET TRAN FOR FIRST UFD ;WHO BEQ ENDUIC ;WHO NEWUFD: JSR PC,DFTRAN ;READ IN UFD BLOCK ;WHO MOV #UFDBUF+2,R1 ;A3;WHO MOVB #12,UICG-1 ;WHO MOVB #12,UICG-2 ;WHO MOV #11,LPHEAD+4 ;WHO MOV #UICG-2,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO MOV (R0)+,TRAN ;SET TRAN FOR FIRST UFD ;WHO BEQ ENDUIC t ; DKDR R2=%2 ; DKDR R3=%3 ; DKDR R4=%4 ; DKDR R5=%5 ; DKDR SP=%6 ; DKDR PC=%7 ; 5 DKDR .BYTE 4 ; NUMBER OF 16 WORD BLOCKS IN BUFFER DKDR .BYTE INTHD-DK ; OFFSET - INTERRUPT HANDLER (INTHD). DKDR .BYTE INTPRT ; PRIORITY LEVEL OF INTERRUPT (5). DKDR .BYTE 0 ; OFFSET - OPEN HANDLER DKDR .BYTE TRAN-DK ; OFFSET - TRANSFER ROUTINE DKDR .BYTE 0 ; OFFSET - CLOSE HANDLER DKDR .BYTE 0 6DDRESS OF FIRST FILENAME ;WHO MOV #-7,R4 ;7 FILES PER BLOCK ;WHO NEWFIL: TST (R1) ;ANYBODY IN THAT SLOT ;WHO BNE FILLST ;IF SO LIST HIM ;WHO ADD #22,R1 ;IF NOT ADVANCE TO NEXT SLOT ;WHO MORFIL: INC R4 ;WHO BMI NEWFIL ;WHO7 ;WHO NEWUFD: JSR PC,DFTRAN ;READ IN UFD BLOCK ;WHO MOV #UFDBUF+2,R1 ;ADDRESS OF FIRST FILENAME ;WHO MOV #-7,R4 ;7 FILES PER BLOCK ;WHO NEWFIL: TST (R1) ;ANYBODY IN THAT SLOT ;WHO BNE FILLST ;IF SO LIST HIM ;WHO ADD #22,R1 ;IF NOT ADVANCE TO NEXT SLOT ;WHO H; UPDATE TO DEC'S SYSLOD (V1A) TO INIT DDC DISK FOR DOS AT DDS. .TITLE DDCINT R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ; THIS PROGRAM WILL INIT A DDC TYPE DISK FOR DOS USE FROM 2K TO 16K ; SECTORS IN SIZE. IT SETS UP THE BIT MAPS, MFD #1 & 2, UIC [1,1] AND ; ZERO'S THE DISK. THE DISK IS NOT A SYSTEM DEVICE AND HAS NO BOOT NOR ; MONLIB FILE ON IT. THE DEVICE CODE FOR DDC DISKS IS 'DK'. ; ; ;THIS IS A REVISED VERSION INCORPORATING A DOUBLE-BUFFER ; SCHEME FOR INPG ; OFFSET - SPECIAL HANDLER DKDR .BYTE 0 ; UNUSED DKDR .RAD50 /DK/ ; DEVICE NAME DKDR .WORD MFDBLK ; SECTOR ADDRESS OF MFD BLOCK #1. DKDR .WORD 0 ; USED BY DOS TO POINT TO CORE BIT MAP DKDR ; SEGMENT. DKDR .PAGE E MOV UFDBUF,TRAN ;IF NO MORE SLOTS GET LINK TO ;WHO BNE NEWUFD ;NEXT UFD BLOCK AND IF NO MORE ;WHO MOV #10,LPHEAD+4 ;WHO MOV #UICG-1,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO ENDUIC: MOV UICTOT,-(SP) ;DECIMAL COUNT FOR THIS UIC ;WHO MOV #COUNT,-(SP) FMORFIL: INC R4 ;WHO BMI NEWFIL ;WHO MOV UFDBUF,TRAN ;IF NO MORE SLOTS GET LINK TO ;WHO BNE NEWUFD ;NEXT UFD BLOCK AND IF NO MORE ;WHO MOV #10,LPHEAD+4 ;WHO MOV #UICG-1,LPHEAD+6 ;WHO JSR PC,LPRINT ""DDDDDDD """"""""""""""""""""""""""""@DDDDDDDDDDDDDDDDDDDDDDDDDDDD """" """"""@DADDB B CKQH)RH*^ $OkP (4^ ##:O4 p:Q1 o:P '[8}O{ 8}^|8}K8}O8}^8}K#Y`O#Y`P#Y`^#Y`K:RT -aK ..:^T {26:KT 88$D*a ͋,L  B8w&B ` % & }&*C$$Βe E%>k  aʋaՀ$ & * P$ ΋Ί   ΋   d Ί  ( 1'u  Q$f $5@ U C΋ Cb M΋U@ U &  B" .&0 M &0 & M 0 &I ;WHO MOV #3,-(SP) ;WHO EMT 42 ;WHO MOV #32,LPHEAD+4 ;WHO MOV #TOTOUT,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO BR MORUIC ;GO BACK FOR NEXT UIC ;WHO J ;WHO ENDUIC: MOV UICTOT,-(SP) ;DECIMAL COUNT FOR THIS UIC ;WHO MOV #COUNT,-(SP) ;WHO MOV #3,-(SP) ;WHO EMT 42 ;WHO MOV #32,LPHEAD+4 ;WHO MOV #TOTOUT,LPHEAD+6 ;WHO K DKDR ; THIS CODE INITIATES EACH TRANSFER, EITHER FROM DOS OR ON AN ATTEMPTED DKDR ; ERROR RECOVERY. DKDR TRAN: MOV #001,RTCONT ; RESET RETRY COUNTER ALLOWS 16 TRYS DKDR ; TWICE. USED IFF CRC OR MISSED TRAN. DKDR MOV PC,R3 ; SET UP TRANSFER VECTOR HERE BECAUSE DKDR ADD #DK-.,R3 ; NOT SAME ADDRESS AS DOS' DK. MUST BE DKDR MOVB 5(R3),R4 LUT & OUTPUT TO SPEED UP THE DISK ; LOADING PROCESS. BECAUSE INPUT USES .READ, EACH ; BUFFER HAS ITS OWN HEADER AND THERE IS THUS NO ; NEED FOR .WAIT BETWEEN SUCCESSIVE READ ; OPERATIONS, I.E. THE SECOND READ BECOMES IMPLIED ; WAIT & ON RETURN FROM THIS, PROCESSING OF THE ; FIRST READ CAN BE BEGUN SAFELY. OUTPUT HOWEVER ; USES .TRAN WITH THE SAME CONTROL BLOCK ; FOR ALL ITS BUFFERS. ; .WAIT IS THEREFORE ESSENTIAL BEFORE EACH OUTPUT ; IN ORDER TO BE ABLE TO SET UP THE .TRAN BLOCK ; ONLM .PAGE ;WHO ;ROUTINE TO PRINT OUT ALL INFORMATION FOR A GIVEN FILE ;WHO FILLST: MOV (R1)+,-(SP) ;UNPACK FILENAME ;WHO MOV #FIL,-(SP) ;WHO MOV #1,-(SP) ;WHO EMT 42 ;WHO MOV (R1)+,-(SP) N JSR PC,LPRINT ;WHO BR MORUIC ;GO BACK FOR NEXT UIC ;WHO .PAGE ;WHO ;ROUTINE TO PRINT OUT ALL INFORMATION FOR A GIVEN FILE ;WHO FILLST: MOV (R1)+,-(SP) ;UNPACK FILENAME ;WHO MOV #FIL,-(SP) ;WHO MOV #1,-(SP) O ; PIC. FIRST COMPUTE ADDRESS OF DRIVER DKDR ADD R3,R4 ; TABLE IN R3. THEN COMPUTE ADDRESS OF DKDR MOV R4,@#TV ; INTERRUPT HANDLER IN R4. FINALLY DKDR MOV #INTPRT,@#TV+2 ; STORE R4 IN VECTOR AND PRIORITY IN DKDR ; VECTOR+2. DKDR REPEAT: MOVB @PC,@#DCS+1 ; RESET ALL DISK REGISTERS. USES THE DKDR ; ODD ADDRESS 1 TO SET BIT 8 IN DCS. PY WHEN THE PREVIOUS OPERATION HAS BEEN DONE. .PAGE ; GENERAL WRITE ROUTINE -- JSR PC,IT.WRT: ; EXPECTS BLOCK # ON STACK TOP & BUFF ADDR IN R2 IT.WRT: MOV #IT.OUL,-(SP) ; WAIT IN CASE BUSY EMT 1 MOV 2(SP),IT.OUB ; SET TRAN BLOCK ... MOV R2,IT.OUB+2 ; ... BLOCK & BUFF ADDR MOV #IT.OUB,-(SP) ; DO .TRAN MOV #IT.OUL,-(SP) EMT 10 MOV (SP)+,@SP ; HOUSEKEEP STACK RTS PC ; ; OUTPUT BLOCK TO DISK FROM MAIN BUFFERS -- JSR PC,IT.WRZ: ; EXPECTS BLOCK NO ON TOP OQ ;WHO MOV #NAM,-(SP) ;WHO MOV #1,-(SP) ;WHO EMT 42 ;WHO MOV (R1)+,-(SP) ;WHO MOV #EXT,-(SP) ;WHO MOV #1,-(SP) ;WHO EMR ;WHO EMT 42 ;WHO MOV (R1)+,-(SP) ;WHO MOV #NAM,-(SP) ;WHO MOV #1,-(SP) ;WHO EMT 42 ;WHO MOV (R1)+,-(SP) ;WHO MOV SDKDR MOV DK,R1 ; GET ADDRESS OF DDB BLOCK. DKDR CMP (R1)+,(R1)+ ; BUMP POINTER TO SECTOR ADDRESS WORD. DKDR MOV #DER,R0 ; SET R0 TO POINT DER (DCS+10). DKDR MOV (R1)+,-(R0) ; STORE SECTOR ADDRESS IN DAR (DCS+6) DKDR MOV (R1)+,-(R0) ; STORE MEMORY ADDRESS IN CMA(DCS+4) DKDR MOV (R1)+,-(R0) ; STORE BUFFER SIZE (2S COMPLEMENT) IN DKDR ; WCTF STACK. ON EXIT ; NEXT BUFFER IS ZEROED READY FOR REFILL IT.WRZ: MOV IT.OBF,R2 ; GET BUFFER START MOV 2(SP),-(SP) ; SET BLOCK # FOR GEN WRT JSR PC,IT.WRT ; ... & CALL IT ADD #IT.OB2-IT.OB1,R2 ; OTHER BUFFER NOW USABLE CMP R2,#IT.OB2 ; SO SET PTR TO IT BEQ .+6 MOV #IT.OB1,R2 MOV R2,IT.OBF ; SAVE IT ADD #IT.OB2-IT.OB1,R2 ; BUMP TO END CLR -(R2)  ; ... & CLEAR IN REVERSE CMP R2,IT.OBF BNE .-6 MOV (SP)+,@SP ; CLEAR STACK IT.RTN: RTS PC  ; GO UT 42 ;WHO MOVB #114,TYPE ;SET TYPE ;WHO TST (R1) ;WHO BPL .+10 ;WHO MOVB #103,TYPE ;WHO MOV (R1)+,-(SP) ;DECODE DATE ;WHO BIC #170000,(SP) ;CLEAR CHARACTER BITV #EXT,-(SP) ;WHO MOV #1,-(SP) ;WHO EMT 42 ;WHO MOVB #114,TYPE ;SET TYPE ;WHO TST (R1) ;WHO BPL .+10 ;WHO MOVB #103,TYPE W (DCS+2) DKDR MOV (R1),R2 ; GET FUNCTION (READ,WRITE) DKDR BIC #177771,R2 ; CLEAR ALL OTHER JUNK OUT. DKDR BIS #101,R2 ; SET INTERRUPT ENABLE(BIT 6) & GO(BIT0)DKDR MOV R2,-(R0) ; AND STORE IN DCS. DKDR RTS PC ; RETURN TO MONITOR PENDING AN INTERRUPTDKDR .PAGE DKDR XREFILL .PAGE ; MAIN CONTROL ROUTINE: ; START = . ; BEGIN OF PROGRAM. ; MOV #IT.OB1,#0 ; SET UP FIRST OUTPUT BUFFER. IT.OBF=.-2   ; (1ST OUTPUT IS BOOT!!) MOV #IT.OUL,-(SP) ; INIT OUTPUT EMT 6 ; ; DETERMINE DISK SIZE: ; IT.CSR = 165300 ; DDS DISK STATUS REG. ; CLR R5 ; CLEAR SECTOR COUNTER. MOV #IT.CSR,R4 ; SET PTR TO DISK CONTROL MOV #400,@R4 ; ENSURE DISK CLEAR MOV YS ;WHO MOV #DATE,-(SP) ;WHO JSR PC,JULMOV ;WHO MOV (R1)+,-(SP) ;OCTAL MODE WORD ;WHO MOV #MODE,-(SP) ;WHO MOV #5,-(SP) ;WHO EMT 42 ;WHO MOV Z ;WHO MOV (R1)+,-(SP) ;DECODE DATE ;WHO BIC #170000,(SP) ;CLEAR CHARACTER BITS ;WHO MOV #DATE,-(SP) ;WHO JSR PC,JULMOV ;WHO MOV (R1)+,-(SP) ;OCTAL MODE WORD ;WHO MOV #MODE,-(SP) ;WHO MOV #5[; DKDR ; DKDR ; INTERRUPT SERVICE ROUTINE. DKDR INTHD: MOV @#44,-(SP) ; PUT ADDRESS OF REG SAVE ROUTINE ON DKDR JSR R5,@(SP)+ ; STACK FOR PIC JSR. DKDR MOV #DCS,R1 ; GET ADDRESS OF DCS DKDR MOV DK,R0 ; GET ADDR\ #IT.CSR+6,R3 ; SET PTR TO SECTOR ADD. REG. IT.DTL: ADD #4000,R5 ; INCREMENT SEC. COUNT BY 1K MOV R5,@R3 ; WILL DISK RESPOND TO THIS ADD? BIT #4000,@R4 ; IS IT THERE OR NON-EXISTANT? BEQ IT.DTL ; ITS THERE, KEEP LOOKING MOV R5,R3 ; ALL DONE. SAVE COUNT IN R3. MOV #400,@R4 ; CLEAR THE DISK ; ; CLEAR THE DISK TO ALL ZEROS. ; CLR R1  ; SET BLOCK COUNTER IT.CDF: MOV R1,-](R1)+,-(SP) ;OCTAL STARTING BLOCK ;WHO MOV #START,-(SP) ;WHO MOV #5,-(SP) ;WHO EMT 42 ;WHO MOVB #40,START ;WHO ADD (R1),UICTOT ;UPDATE TOTAL UIC COUNT ;WHO ADD (R1),ALLTOT ;AND TOTAL DISK COUNT ^,-(SP) ;WHO EMT 42 ;WHO MOV (R1)+,-(SP) ;OCTAL STARTING BLOCK ;WHO MOV #START,-(SP) ;WHO MOV #5,-(SP) ;WHO EMT 42 ;WHO MOVB #40,START _ESS OF DDB FOR COMPLETION EXITDKDR MOV (R1),R2 ; GET DCS INTO R2 DKDR BMI ERR ; BRANCH IF ERROR CAUSED INTERRUPT. DKDR EXIT: MOV 14(R0),PC ; ELSE TAKE COMPLETION EXIT VIA DDB DKDR ; DKDR ; ERROR HANDLER. DKDR ; DKDR ERR: `(SP) ; CLEAR OUT DISK JSR PC,IT.WRZ CMPB (R1)+,(R1)+ ; (ALTERNATE BLOCKS!) CMP R1,R5 BLT IT.CDF BGT .+10  ; DONE TWO PASSES? MOV #1,R1  ; IF NOT DO 2ND NOW BR IT.CDF ; PREPARE SET UP PERMANENT BIT MAPS: CLR R4  ; CALCULATE NO. BM REQD INC R4  ; RESULT IN R4 SUB #960.,R5 BCC .-6 ADD #960.,R5 ; REMAINDER IN R5 ASR R5  ; REDUCE TO BM BYTES ASR R5 ASR R5 SUB R4,R3  ; START BM BLOCK MOV R3,R0  ; AGAIN SAVE FOR LATER a ;WHO MOV (R1)+,-(SP) ;DECIMAL BLOCK COUNT ;WHO MOV #LENGTH,-(SP) ;WHO MOV (SP),R3 ;WHO MOV #3,-(SP) ;WHO EMT 42 ;WHO CMPB (R3),#60 ;WHO BNE .+10 b ;WHO ADD (R1),UICTOT ;UPDATE TOTAL UIC COUNT ;WHO ADD (R1),ALLTOT ;AND TOTAL DISK COUNT ;WHO MOV (R1)+,-(SP) ;DECIMAL BLOCK COUNT ;WHO MOV #LENGTH,-(SP) ;WHO MOV (SP),R3 ;WHO MOV #3,-(SP) ;WHO EMT 42 c BIT #11000,R2 ; IS CRC(BIT 12) OR MISSED TRAN.(BIT 9) DKDR BEQ FATAL ; SET? IF NOT USE F 26 ERROR TO ABORT. DKDR ASL (PC)+ ; YES. HAVE WE RETRIED 16 TIMES YET? DKDR RTCONT: .WORD 0 ; (RETRY COUNTER) DKDR BCS ERR10 ; IF SO, RETURN VIA COMPLETION EXIT. DKDR JSR PC,REPEAT ; OTHERWISE, TRY AGAIN. DKDR RETURN: MOV @#46,-(SP) ; FIRST MUST RESd .PAGE ; DO ALL MAPS BUT LAST: MOV #3,8.(R2) ; SET BLOCKS 0 & 1 IN USE. CLR R1 ; CLEAR MAP # COUNTER IT.BMG: MOV R3,-(SP) ; SAVE BLOCK NO. FOR WRITE INC R3  ; STEP FOR LINK INC R1  ; SET MAP NO. MOV R3,(R2)+ ; STORE BOTH AT MAP START MOV R1,(R2)+ MOV #60.,(R2)+ ; FOLLOWED BY MAP SIZE MOV R0,@R2 ; ... & 1ST MAP NO. DEC R4  ; AT LAST MAP? BEQ IT.BMD JSR PC,IT.WRZ ; IF NOT WRITE OUT BR IT.BMG ; NOW DO LASTe ;WHO MOVB #40,(R3)+ ;WHO BR .-12 ;WHO MOV (R1)+,-(SP) ;OCTAL LAST BLOCK ;WHO MOV #LAST,-(SP) ;WHO MOV #5,-(SP) ;WHO EMT 42 f ;WHO CMPB (R3),#60 ;WHO BNE .+10 ;WHO MOVB #40,(R3)+ ;WHO BR .-12 ;WHO MOV (R1)+,-(SP) ;OCTAL LAST BLOCK ;WHO MOV #LAST,-(SP) gTORE REGISTERS VIA DOS DKDR JSR R5,@(SP)+ ; RESTORATION ROUTINE. DKDR RTI ; THEN DO RTI. DKDR ERR10: BIS #100000,12(R0) ; INDICATE PARITY ERROR DKDR TST @#WC ; IS WC=0? IF SO AT BLOCK END. DKDR BEQ EXIT ; RETURN VIA COMPLETION EXIT (FLAG SET) DKDR ; OTHERWISE, USE ERROR RETURN SINCE WE DKDR h MAP: IT.BMD: CLR -6(R2)  ; SCRUB LAST LINK MOV #100000,R4 ; SET MASK ADD R5,R2  ; GET TRUE MAP END MOV R2,R1 ASR R5 SUB #60.,R5  ; ... & SET UNUSED WORD CNT MOV R3,-(SP) ; SET BLOCK POINTER IT.BML: DEC @SP  ; DROP IT BIS R4,@R1  ; MARK IT IN MAP ASR R4  ; ADJUST MASK BCC .+6  ; ACROSS WORDS IF NEC. ROR R4 TST -(R1) CMP @SP,R0  ; BACK AT 1ST MAP BLOCK? BGE IT.BML  ; ALLOWING FOR MFD #2 CMP (R2)+,(SP)+ COM (R2)+  ; FIi ;WHO MOVB #40,LAST ;WHO MOV (R1)+,-(SP) ;OCTAL PROTECT CODE ;WHO MOV #PRO-3,-(SP) ;WHO MOV #5,-(SP) ;WHO EMT 42 ;WHO MOVB #40,PRO-1 ;WHO MOVB #40,PRO-2 j ;WHO MOV #5,-(SP) ;WHO EMT 42 ;WHO MOVB #40,LAST ;WHO MOV (R1)+,-(SP) ;OCTAL PROTECT CODE ;WHO MOV #PRO-3,-(SP) ;WHO MOV #5,-(SP) ;WHO EMT 42 k ; CAN'T RECOVER AND ONLY PARTIAL BLOCK DKDR ; TRANSFERED. DKDR FATAL: CLR DK ; FREE DRIVER FOR OTHER USERS DKDR MOV (R1),-(SP) ; PUT DCS ON STACK FOR CONSOLE PRINTOUT.DKDR MOV #1426,-(SP) ; PUT ERROR CODE ON STACK(= F 26). DKDR IOT ; GO TO DOS DIAGNOSTIC ROUTINE. SINCE DKDR .END ; FATAL WILL NEVER RETlLL UNUSED MAP SECTION INC R5 BNE .-4 JSR PC,IT.WRZ ; ... & WRITE OUT .PAGE ; BUILD MFD BLOCK #1: MOV R0,@R2  ; SET LINK TO MFD #2 DEC @R2 MOV (R2)+,-(SP) ; SAVE FOR LATER MOV #5,(R2)+ ; INTERLEAVE FACTOR MOV R0,(R2)+ ; SET 1ST MAP NO. MOV R0,(R2)+ ; FOLLOWED BY LIST INC R0 CMP R0,R3 BNE .-6 MOV #1,-(SP) JSR PC,IT.WRZ ; BUILD MFD BLOCK #2: CLR (R2)+  ; ZERO LINK MOV #401,(R2)+ ; MONITOR UIC = 1,1 CLR (R2)+ m ;WHO MOVB #40,PRO-3 ;WHO MOV #110,LPHEAD+4 ;SPIT IT ALL OUT ;WHO MOV #TYPE-4,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO BR MORFIL ;WHO .PAGE n ;WHO MOVB #40,PRO-1 ;WHO MOVB #40,PRO-2 ;WHO MOVB #40,PRO-3 ;WHO MOV #110,LPHEAD+4 ;SPIT IT ALL OUT ;WHO MOV #TYPE-4,LPHEAD+6 ;WHO JSR PC,LPRINT URN. DKDR p ; NO UFD ASSIGNED YET. MOV #9.,(R2)+ ; NO. OF ENTRIES/UFD CLR (R2)+ JSR PC,IT.WRZ ; WRITE OUT MOV #IT.OUL,-(SP) ; RELEASE THE OUTPUT DATASET EMT 7 EMT 60 .PAGE ; DATA AREAS: ; A) BUFFER SPACE: IT.OB1:    ; OUTPUT .=.+200 IT.OB2: .=.+200 ; ; B) LINK BLOCKS: IT.OUL: .WORD 0,0,1 .RAD50 /DK/ ; DEVICE CODE ; D) OUTPUT TRAN BLOCK: IT.OUB: .WORD 0,0,64.,2,0 ; .END START q ;WHO ;PRINT TOTAL BLOCK COUNT FOR ALL UICS ;WHO ALLOUT: MOV #11,LPHEAD+4 ;WHO MOV #ALLUIC,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO MOV ALLTOT,-(SP) ;WHO MOV #COUNT,-(SP) ;WHO MOV #3,-(SP) r;WHO BR MORFIL ;WHO .PAGE ;WHO ;PRINT TOTAL BLOCK COUNT FOR ALL UICS ;WHO ALLOUT: MOV #11,LPHEAD+4 ;WHO MOV #ALLUIC,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO MOV ALLTOT,-(SP) s; UPDATE 12/18/72 DDCINT.S03 ; UPDATE 10/27/72 DDCINT.S02 ; UPDATE TO DEC'S SYSLOD (V1A) TO INIT DDC DISK FOR DOS AT DDS. .TITLE DDCINT R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ; THIS PROGRAM WILL INIT A DDC TYPE DISK FOR DOS USE FROM 2K TO 16K ; SECTORS IN SIZE. IT SETS UP THE BIT MAPS, MFD #1 & 2, UIC [1,1] AND ; ZERO'S THE DISK. THE DISK IS NOT A SYSTEM DEVICE AND HAS NO BOOT NOR ; MONLIB FILE ON IT. THE DEVICE CODE FOR DDC DISKS IS ' ; THE END AND THE BEGINNING. u ;WHO EMT 42 ;WHO MOV #32,LPHEAD+4 ;WHO MOV #TOTOUT,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO .PAGE ;WHO ; PRINT BIT MAPS ;WHOv ;WHO MOV #COUNT,-(SP) ;WHO MOV #3,-(SP) ;WHO EMT 42 ;WHO MOV #32,LPHEAD+4 ;WHO MOV #TOTOUT,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO wDK'. ; ; ;THIS IS A REVISED VERSION INCORPORATING A DOUBLE-BUFFER ; SCHEME FOR INPUT & OUTPUT TO SPEED UP THE DISK ; LOADING PROCESS. BECAUSE INPUT USES .READ, EACH ; BUFFER HAS ITS OWN HEADER AND THERE IS THUS NO ; NEED FOR .WAIT BETWEEN SUCCESSIVE READ ; OPERATIONS, I.E. THE SECOND READ BECOMES IMPLIED ; WAIT & ON RETURN FROM THIS, PROCESSING OF THE ; FIRST READ CAN BE BEGUN SAFELY. OUTPUT HOWEVER ; USES .TRAN WITH THE SAME CONTROL BLOCK ; FOR ALL ITS BUFFERS. ; .WAIT IS THEREFORx DKDR ; DKDR ; DISK REGISTERS DKDR DCS =165300 ; DISK CONTROL STATUS REGISTER DKDR WC =165302 ; WORD COUNT REGISTER DKDR CMA =165304 ; CURRENT MEMORY ADDRESS REGISTER DKDR DAR =165306 ; DISK ADDRESS REGISTER DKDR DER =165310 y CLR R5 ;BLOCK COUNT ;WHO MOV #103,-(SP) ;WHO EMT 41 ;GET DATE AGAIN ;WHO MOV #MAPDAT,-(SP) ;WHO JSR PC,JULMOV ;WHO MAPOUT: MOV MAPLNK,TRAN ;LINK TO NEXT MAP ;WHO BEQ FINMAP ;EXIT WHz .PAGE ;WHO ; PRINT BIT MAPS ;WHO CLR R5 ;BLOCK COUNT ;WHO MOV #103,-(SP) ;WHO EMT 41 ;GET DATE AGAIN ;WHO MOV #MAPDAT,-(SP) ;WHO JSR PC,JULMOV E ESSENTIAL BEFORE EACH OUTPUT ; IN ORDER TO BE ABLE TO SET UP THE .TRAN BLOCK ; ONLY WHEN THE PREVIOUS OPERATION HAS BEEN DONE. .PAGE ; GENERAL WRITE ROUTINE -- JSR PC,IT.WRT: ; EXPECTS BLOCK # ON STACK TOP & BUFF ADDR IN R2 IT.WRT: MOV #IT.OUL,-(SP) ; WAIT IN CASE BUSY EMT 1 MOV 2(SP),IT.OUB ; SET TRAN BLOCK ... MOV R2,IT.OUB+2 ; ... BLOCK & BUFF ADDR MOV #IT.OUB,-(SP) ; DO .TRAN MOV #IT.OUL,-(SP) EMT 10 MOV (SP)+,@SP ; HOUSEKEEP STACK RTS PC ;  ; DISK ERROR REGISTER DKDR DBR =165312 ; DATA BUFFER REGISTER DKDR MA =165314 ; MAINTENANCE REGISTER DKDR ADS =165316 ; DISK SECTOR ADDRESS REGISTER DKDR ; DKDR TV =130 ; INTERRUPT TRANSFER VECTOR ADDRESS DKDR INTPRT =240 ; PS FOR INTERRUPT }EN DONE ;WHO ; ;WHO ; TO COMPUTE THE SIZE OF THE DEVICE ASSUME THE BIT MAPS ARE PLACED AT ;WHO ; THE HIGH END OF THE DEVICE. THEN THE ADDRESS OF THE LAST MAP +1 WILL ;WHO ; BE THE NUMBER OF SECTORS ON THE DEVICE THAT ARE BEING USED BY DOS. ;WHO ; ;WHO MOV MAPLNK,DISIZE ; GET BIT MAP'S ADDRESS ;WHO ~ ;WHO MAPOUT: MOV MAPLNK,TRAN ;LINK TO NEXT MAP ;WHO BEQ FINMAP ;EXIT WHEN DONE ;WHO ; ;WHO ; TO COMPUTE THE SIZE OF THE DEVICE ASSUME THE BIT MAPS ARE PLACED AT ;WHO ; THE HIGH END OF THE DEVICE. THEN THE ADDRESS OF THE LAST MAP +1 WILL ;WHO ; BE THE NUMBER OF SECTORS ON THE DEVICE THAT ARE BEING USED BY DOS. ;WHO ;  .TITLE TAPDSK ; ; PROGRAM TO RESTORE RF11 DISK FROM DECTAPES ; THE ENTIRE 256K PLATTER WILL BE WRITTEN IN ABSOLUTE BINARY ; FORMAT FROM TWO DECTAPES ; EACH ADDITIONAL AVAILABLE PLATTER WILL BE WRITTEN ON ; SUCCESSIVE PAIRS OF DECTAPES ; ; RUNNING SEQUENCE: ; ; 1. MOUNT FIRST TWO SAVED DECTAPES ON DRIVES 0 AND 1 ; 2. RUN TAPDSK PROGRAM ; 3. AFTER THE FIRST PLATTER IS WRITTEN A HALT WILL ; 4. FOR EACH ADDITIONAL PLATTER MOUNT NEXT TWO DECTAPE ; ON DRIVES 0 A.8}:@sr@@(@(0  75 *,(7ve#  p, INC DISIZE ; AND ADD 1 TO IT FOR DEVICE SIZE. ;WHO JSR PC,DFTRAN ;WHO MOV TRAN+2,R0 ;BUFFER ADDRESS ;WHO MOV (R0)+,MAPLNK ;NEXT LINK ;WHO TST (R0)+ ;MAP NUMBER ;WHO MOV (R0)+,R4 ;MAP SIZE ;WHO MAPWRD: TST (R0)+ ;ADVANCE TO NE ;WHO MOV MAPLNK,DISIZE ; GET BIT MAP'S ADDRESS ;WHO INC DISIZE ; AND ADD 1 TO IT FOR DEVICE SIZE. ;WHO JSR PC,DFTRAN ;WHO MOV TRAN+2,R0 ;BUFFER ADDRESS ;WHO MOV (R0)+,MAPLNK ;NEXT LINK ;WHO TST (R0)+ ;MAP NUMBER ND 1 AND PRESS CONTINUE ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; .GLOBL INR. ; GET INIT PROCESSOR .GLOBL TRA. ; GET TRAN PROCESSOR .GLOBL RLS. ; GET RELEASE PROCESSOR ; ; INIT DISK AND CLEAR COUNTERS ; START: MOV #DLK,-(SP) ;INIT DISK EMT 6 CLR R0 ;R0 IS DISK BLOCK INDEX CLR R1 ;R1 IS TAPE DRIVE SWITCH ; ; COPY ONE-HALF PLATTELe 5 5 ,p 2ȋ _C,8}   k E : @XT MAPWORD ;WHO MOV #-100,R3 ;64 BITS PER LINE ;WHO MOV #BITMAP,R1 ;FORMATTED LINE BUFFER ;WHO FORMAP: MOVB #60,(R1) ;SET ZERO ;WHO ROR (R0) ;DROP MAP BIT IN CARRY ;WHO BCC .+10 ;LEAVE 0 AND FREEB IF OPEN ;WHO INCB (R1) ;WHO DE ;WHO MOV (R0)+,R4 ;MAP SIZE ;WHO MAPWRD: TST (R0)+ ;ADVANCE TO NEXT MAPWORD ;WHO MOV #-100,R3 ;64 BITS PER LINE ;WHO MOV #BITMAP,R1 ;FORMATTED LINE BUFFER ;WHO FORMAP: MOVB #60,(R1) ;SET ZERO ;WHO ROR (R0) ;DROP MAP BIT IN CARRY ;WHO BCC R FROM DECTAPE ; COPY: CLRB TLK+5 ;PRESET DRIVE 0 BIT #1,R1 ;IS IT REALLY DRIVE 0? BEQ .+6 ;YUP INCB TLK+5 ;RESET FOR DRIVE 1 MOV #TLK,-(SP) ;THE BIGGE INIT EMT 6 CLR R2 ;R2 IS TAPE BLOCK INDEX CLP: MOV R2,TRN ;SET TAPE BLOCK MOV #TRN,-(SP) ; AND READ MOV #TLK,-(SP) EMT 10 MOV #TLK,- v~v~@v~8}.v~  75 *~7v$ek*~e 5 5 *~ 2ȋ _T* 8} . . .Jv~C FREEB ;WHO INC R1 ;WHO INC R3 ;WHO BPL MAPPRT ;PRINT AFTER 64 BITS ;WHO BIT #7,R3 ;SPACE AFTER EVERY 8 ;WHO BNE FORMAP ;WHO MOVB #40,(R1)+ .+10 ;LEAVE 0 AND FREEB IF OPEN ;WHO INCB (R1) ;WHO INC FREEB ; COUNT A FREE BLOCK ;WHO INC R1 ;WHO INC R3 ;WHO BPL MAPPRT ;PRINT AFTER 64 BITS ;WHO BIT #7,R3 ;SPACE AFTER EVERY 8 (SP) ;WAIT EMT 1 MOV R0,DRN ;SET DISK BLOCK MOV #DRN,-(SP) ; AND WRITE MOV #DLK,-(SP) EMT 10 MOV #DLK,-(SP) ;WAIT EMT 1 ADD #128.,R0 ;BUMP DISK BLOCK INDEX ADD #32.,R2 ;BUMP TAPE BLOCK INDEX BIT #3777,R0 ;END OF HALF-PLATTER BNE CLP ; IF MODULO 2048 BLOCKS ; ; END OF HALF-PLATTER ; BUMP DRIVE SWI .TITLE DSKTAP ; ; PROGRAM TO SAVE RF11 DISK ON DECTAPES ; THE ENTIRE 256K PLATTER WILL BE WRITTEN IN ABSOLUTE BINARY ; FORMAT ON TWO DECTAPES ; EACH ADDITIONAL AVAILABLE PLATTER WILL BE WRITTEN ON ; SUCCESSIVE PAIRS OF DECTAPES ; ; RUNNING SEQUENCE: ; ; 1. MOUNT TWO FORMATTED DECTAPES ON DRIVES 0 AND 1 ; 2. RUN DSKTAP PROGRAM ; 3. AFTER THE FIRST PLATTER IS WRITTEN A HALT WILL ; 4. FOR EACH ADDITIONAL PLATTER MOUNT TWO MORE DECTAPE ; ON DRIVES 0 AND 1 AND ;WHO BIT #17,R3 ;NEW MAP WORD EVERY 16 BITS ;WHO BNE FORMAP ;WHO TST (R0)+ ;WHO BR FORMAP ;WHO MAPPRT: BIT #3777,R5 ;NEW PAGE EVERY 32 LINES ;WHO BNE .+22 ;WHO MOV ;WHO BNE FORMAP ;WHO MOVB #40,(R1)+ ;WHO BIT #17,R3 ;NEW MAP WORD EVERY 16 BITS ;WHO BNE FORMAP ;WHO TST (R0)+ ;WHO BR FORMAP ;WHO MAPPRT: BIT #3TCH AND CHECK FOR END OF PLATTER ; MOV #TLK,-(SP) ; RELEASE THE TAPE EMT 7 ; INC R1 ;BUMP TAPE DRIVE SWITCH BIT #1,R1 ;CHECK FOR DRIVE 0 AGAIN BNE COPY ;BACK TO WRITE DRIVE 1 ; ; END OF PLATTER - HALT FOR MAYBE ANOTHER PLATTER ; ; HALT ; BR COPY ; MOV #DLK,-(SP) ; RELEASE THE DISK EMT 7 ; ; ; HERE WE ARE PRESS CONTINUE ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ; .GLOBL INR. ; GET INIT PROCESSOR ; .GLOBL TRA. ; GET TRAN PROCESSOR ; .GLOBL RLS. ; GET RELEASE PROCESSOR ; .GLOBL XIT. ; GET EXIT PROCESSOR ; ; INIT DISK AND CLEAR COUNTERS ; START: MOV #DLK,-(SP) ;INIT DISK EMT 6 CLR R0 ;R0 IS DISK BLOCK INDEX CLR R1 ;R1 IS#35,LPHEAD+4 ;WHO MOV #MAPMES,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO MOV R5,-(SP) ;OCTAL BLOCK NUMBER ;WHO MOV #BLKNO,-(SP) ;WHO MOV #5,-(SP) ;WHO EMT 42 777,R5 ;NEW PAGE EVERY 32 LINES ;WHO BNE .+22 ;WHO MOV #35,LPHEAD+4 ;WHO MOV #MAPMES,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO MOV R5,-(SP) ;OCTAL BLOCK NUMBER ;WHO MOV #BLKNO,-(SP) GOING TO FAKE THE ROM DISK BOOTSTRAP. INLINE CODE ; IS USED TO PROVIDE FOR ERROR DETECTION. ; BEGLUP: RESET ; CLEAR THE BUS REGISTERS. MOV #10.,R3 ; SET THE RETRY COUNTER ERRLUP: DEC R3 ; COUNT THIS TRY. BNE BOOT10 ; HAVEN'T RUN OUT YET. HALT ; RUN OUT. STOP HERE BR BEGLUP ; A 'CONT' WILL TRY A SECOND BATCH. BOOT10: MOV #177462,R0 ; PUT ADDRESS OF DIS TAPE DRIVE SWITCH ; ; COPY ONE-HALF PLATTER ONTO DECTAPE ; COPY: CLRB TLK+5 ;PRESET DRIVE 0 BIT #1,R1 ;IS IT REALLY DRIVE 0? BEQ .+6 ;YUP INCB TLK+5 ;RESET FOR DRIVE 1 MOV #TLK,-(SP) ;THE BIGGE INIT EMT 6 CLR R2 ;R2 IS TAPE BLOCK INDEX CLP: MOV R0,DRN ;SET DISK BLOCK MOV #DRN,-(SP) ; AND READ MOV #DLK,-(S ;WHO MOV #122,LPHEAD+4 ;WHO MOV #MAPLIN,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO MORMAP: ADD #100,R5 ;WHO CMP DISIZE,R5 ; HAVE WE REACHED THE END OF THE DEVICE ;WHO ; (MAY NOT BE END OF LAST BIT MAP) ;WHO BEQ FINMAP ;WHO MOV #5,-(SP) ;WHO EMT 42 ;WHO MOV #122,LPHEAD+4 ;WHO MOV #MAPLIN,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO MORMAP: ADD #100,R5 ;WHO CMP DISIZE,RK WORD COUNT REGISTE MOV #177400,(R0) ; PUT A -256 WORD COUNT IN IT. MOV #5,-(R0) ; SET THE DISK FUNCTION FOR: READ/GO BOOT20: TSTB (R0) ; WAIT HERE UNTIL BIT 7 GOES ON FOR DONE BPL BOOT20 ; TST (R0) ; NOW CHECK FOR ERRORS. BMI ERRLUP ; ERROR. GO TRY ALL OVER AGAIN. ; ALL A-OK.. GO TO READ IN CODE. JMP @#0 ; TRANSFER CONTROLP) EMT 10 MOV #DLK,-(SP) ;WAIT EMT 1 MOV R2,TRN ;SET TAPE BLOCK MOV #TRN,-(SP) ; AND WRITE MOV #TLK,-(SP) EMT 10 MOV #TLK,-(SP) ;WAIT EMT 1 ADD #128.,R0 ;BUMP DISK BLOCK INDEX ADD #32.,R2 ;BUMP TAPE BLOCK INDEX BIT #3777,R0 ;END OF HALF-PLATTER BNE CLP ; IF MODULO 2048 BLOCKS ; EXIT IF DONE VIA FINMAP. **;WHO SUB #4,R4 ;USE 4 WORDS PER LINE ;WHO BGT MAPWRD ;WHO BR MAPOUT ;WHO FINMAP: MOV FREEB,-(SP) ;NOW COMPUTE REAL FREE COUNT ;WHO MOV #FCOUNT,-(SP) ;WHO MOV #3,-(SP) 5 ; HAVE WE REACHED THE END OF THE DEVICE ;WHO ; (MAY NOT BE END OF LAST BIT MAP) ;WHO BEQ FINMAP ; EXIT IF DONE VIA FINMAP. **;WHO SUB #4,R4 ;USE 4 WORDS PER LINE ;WHO BGT MAPWRD ;WHO BR MAPOUT ;WHO FINMAP: MOV FREEB,-(SP) ;NOW COMPUTE REAL FREE COUNT TO READ IN CODE. ; ; THE GOOD-TIME MAN IS HERE ; .WORD 0 TLK: .WORD 0 .RAD50 /TAP/ .WORD 1 .RAD50 /DT/ .WORD 0 DLK: .WORD 0 .RAD50 /DSK/ .WORD 1 .RAD50 /DF/ TRN: .WORD 0 .WORD BUFF .WORD 8192. .WORD 4 .WORD 0 DRN: .WORD 0 .WORD BUFF .WORD 8192. .WORD 2 .WORD 0 BUFF: .WORD 0 ; ; END OF HALF-PLATTER ; BUMP DRIVE SWITCH AND CHECK FOR END OF PLATTER ; MOV #TLK,-(SP) ; RELEASE THE TAPE EMT 7 ; INC R1 ;BUMP TAPE DRIVE SWITCH BIT #1,R1 ;CHECK FOR DRIVE 0 AGAIN BNE COPY ;BACK TO WRITE DRIVE 1 ; ; END OF PLATTER - HALT FOR MAYBE ANOTHER PLATTER ; ; HALT ; BR COPY ; MOV #DLK,-(SP) ; RELEASE THE DISK EMT ;WHO EMT 42 ;WHO MOVB #40,FCOUNT ;WHO MOV DISIZE,-(SP) ; DISK SIZE LESS # FREE BLOCKS YEILDS ;WHO SUB FREEB,(SP) ; # OF SECTORS USED. ;WHO MOV #UCOUNT,-(SP) ;WHO MOV #3,-(SP) ;WHO EMT 42 ;WHO MOV #FCOUNT,-(SP) ;WHO MOV #3,-(SP) ;WHO EMT 42 ;WHO MOVB #40,FCOUNT ;WHO MOV DISIZE,-(SP) ; DISK SIZE LESS # FREE BLOCKS YEILDS ;WHO SUB FREEB,(SP) ; # OF SECTORS USED. ;WHO MOV #UCOUNT,-(SP) .=.+16384. .END START 7 ; EMT 60 ; FOR GES WE CAN EXIT. ONLY 1 PLATTER ; ; THE GOOD-TIME MAN IS HERE ; .WORD 0 TLK: .WORD 0 .RAD50 /TAP/ .WORD 1 .RAD50 /DT/ .WORD 0 DLK: .WORD 0 .RAD50 /DSK/ .WORD 1 .RAD50 /DF/ TRN: .WORD 0 .WORD BUFF .WORD 8192. .WORD 2 .WORD 0 DRN: .WORD 0 .WORD BUFF .WORD 81 ;WHO MOVB #40,UCOUNT ;WHO MOVB #40,UCOUNT-1 ;WHO MOVB #40,UCOUNT-2 ;WHO MOVB #40,MAPMES+2 ;WHO MOVB #40,MAPMES+3 ;WHO MOVB #12,MAPMES ;NO PAGE EJECT ;WHO MOV #3,-(SP) ;WHO EMT 42 ;WHO MOVB #40,UCOUNT ;WHO MOVB #40,UCOUNT-1 ;WHO MOVB #40,UCOUNT-2 ;WHO MOVB #40,MAPMES+2 &8}(@(~0x  7e5[n 7fxn*(,(xxHnnex xn n.,Le 5n 5x092. .WORD 4 .WORD 0 BUFF: .WORD 0 .=.+16384. .END START ;WHO MOV #107,LPHEAD+4 ; LAST MESS WITH EXTRA CR,LF TO FORCE OT;WHO MOV #MAPMES-2,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO EXIT =. ;WHO MOV #LPLINK,-(SP) ; CLOSE THE LINE PRINTER. ;WHO EMT 17 ;WHO MOV #LPLINK,-(SP) ; ;WHO MOVB #40,MAPMES+3 ;WHO MOVB #12,MAPMES ;NO PAGE EJECT ;WHO MOV #107,LPHEAD+4 ; LAST MESS WITH EXTRA CR,LF TO FORCE OT;WHO MOV #MAPMES-2,LPHEAD+6 ;WHO JSR PC,LPRINT ;WHO EXIT =. ;WHO MOV #LPLINK,-(SP) ; CLRnx,p8}     ^ @~~@~8}.~  7e5[ 7f$e*~He*~e 5 50 * 8} . . .J~RELEASE THE LINE PRINTER ;WHO EMT 7 ; ;WHO MOV #DFLINK,-(SP) ; RELEASE THE DISK ;WHO EMT 7 ; ;WHO EMT 60 ; EXIT ;WHO .PAGE ;WHO DFTRAN: MOV #TRAN,-(SP) ;WHOOSE THE LINE PRINTER. ;WHO EMT 17 ;WHO MOV #LPLINK,-(SP) ; RELEASE THE LINE PRINTER ;WHO EMT 7 ; ;WHO MOV #DFLINK,-(SP) ; RELEASE THE DISK ;WHO EMT 7 ; ;WHO EMT 60 ; EXIT ;WHO ; DECTAPE COPY ROUTINE, VER 001A ; DR. WILLIAM GODWIN ; EDUCATIONAL TESTING SERVICE ; PRINCETON, NEW JERSEY R0=%0 R1=%1 R2=%2 R5=%5 SP=%6 PC=%7 ;ASSIGNMENTS ;FOR 8K CONFIGURATIONS, SET ; WBLOCK=2048. ; HBLK=8. ;FOR 12K CONFIGURATIONS, SET ; WBLOCK=4096. ; HBLK=16. WBLOCK=4096. HBUFSZ=WBLOCK+WBLOCK FBUFSZ=HBUFSZ+HBUFSZ HBLK=16. FBLK=HBLK+HBLK ;BUFFERS & REGISTERS VE; UPDATE 1 27 APR 1972 TEMP FIX FOR LENGTH -B20K ; DECTAPE COPY ROUTINE, VER 001A ;  DR. WILLIAM GODWIN ;  EDUCATIONAL TESTING SERVICE ;  PRINCETON, NEW JERSEY R0=%0 R1=%1 R2=%2 R5=%5 SP=%6 PC=%7  ;ASSIGNMENTS ;FOR 8K CONFIGURATIONS, SET ; WBLOCK=2048. ; HBLK=8. ;FOR 12K CONFIGURATIONS, SET ; WBLOCK=4096. ; HBLK=16. WBLOCK = 8192. HBUFSZ=WBLOCK+WBLOCK FBUFSZ=HBUFSZ+HBUFSZ HBLK = 32. FBLK=HBLK+ MOV #DFLINK,-(SP) ;WHO EMT 10 ;WHO MOV #DFLINK,-(SP) ;WHO EMT 1 ;WHO RTS PC ;WHO LPRINT: MOV #LPHEAD,-(SP) ;WHO MOV #LPLINK,-(SP) .PAGE ;WHO DFTRAN: MOV #TRAN,-(SP) ;WHO MOV #DFLINK,-(SP) ;WHO EMT 10 ;WHO MOV #DFLINK,-(SP) ;WHO EMT 1 ;WHO RTS PC RIFY: .WORD 0 EWORD: .WORD 0 TCOUNT: .WORD -5 VCOUNT: .WORD -5 UNIT: .WORD 0 SWITCH: .WORD 0 BUFF0: .WORD 80.,0,0 BUFF1: .WORD 0 .=.+HBUFSZ BUFF2: .WORD 0 .=.+HBUFSZ ;CONTROL BLOCKS .WORD 0 ;TTY PRINTER LINK BLOCK LNKP: .WORD 0,0 .BYTE 1,0 .RAD50 /KB/ .WORD 0 ;PRINTER FILE BLOCK .BYTE 2,0 FBLKP: .WORD 0,0,0,0,0 .WORD 0 ;TTY KEYBOARD LINK BLOCK LNKK: .WORD 0,0 .BYTE 1,0 .RAD50 /KB/ .WORD 0 ;KEYBOARD FILE BLOCK .BYTE 4HBLK  ;BUFFERS & REGISTERS VERIFY: .WORD 0 EWORD: .WORD 0 TCOUNT: .WORD -5 VCOUNT: .WORD -5 UNIT: .WORD 0 SWITCH: .WORD 0 BUFF0: .WORD 80.,0,0 BUFF1: .WORD 0 .=.+HBUFSZ BUFF2: .WORD 0 .=.+HBUFSZ  ;CONTROL BLOCKS .WORD 0  ;TTY PRINTER LINK BLOCK LNKP: .WORD 0,0 .BYTE 1,0 .RAD50 /KB/ .WORD 0  ;PRINTER FILE BLOCK .BYTE 2,0 FBLKP: .WORD 0,0,0,0,0 .WORD 0  ;TTY KEYBOARD LINK BLOCK LNKK: .WORD 0,0 .BYTE 1,0 .RAD50 /KB/ .W ;WHO EMT 2 ;WHO MOV #LPLINK,-(SP) ;WHO EMT 1 ;WHO RTS PC ;WHO .PAGE ;WHO ; DOS I/O BLOCKS ;WHO ;WHO LPRINT: MOV #LPHEAD,-(SP) ;WHO MOV #LPLINK,-(SP) ;WHO EMT 2 ;WHO MOV #LPLINK,-(SP) ;WHO EMT 1 ;WHO RTS PC ;WHO ,0 FBLKK: .WORD 0,0,0,0,0 .WORD 0 ;DRIVE 0 LINK BLOCK LNK0: .WORD 0,0 .BYTE 1 LNK0U: .BYTE 0 ;UNIT FOR ORIGINAL .RAD50 /DT/ .WORD 0 ;DRIVE 1 LINK BLOCK LNK1: .WORD 0,0 .BYTE 1 LNK1U: .BYTE 0 ;UNIT FOR COPY .RAD50 /DT/ TRANF: .WORD 0 ;FULL BUFFER TRAN BLOCK .WORD BUFF1 .WORD HBUFSZ .WORD 2 ;READ(4)/WRITE(2) .WORD 0 TRAN1: .WORD 0 ;NO. 1 HALF-BUFFER TRAN .WORD BUFF1 .WORD WBLOCK .WORD 4,0 TRAN2: .WORD 0 ;NO. 2 HALF-BUFFORD 0  ;KEYBOARD FILE BLOCK .BYTE 4,0 FBLKK: .WORD 0,0,0,0,0 .WORD 0  ;DRIVE 0 LINK BLOCK LNK0: .WORD 0,0 .BYTE 1 LNK0U: .BYTE 0  ;UNIT FOR ORIGINAL .RAD50 /DT/ .WORD 0  ;DRIVE 1 LINK BLOCK LNK1: .WORD 0,0 .BYTE 1 LNK1U: .BYTE 0  ;UNIT FOR COPY .RAD50 /DT/ TRANF: .WORD 0  ;FULL BUFFER TRAN BLOCK .WORD BUFF1 .WORD HBUFSZ .WORD 2  ;READ(4)/WRITE(2) .WORD 0 TRAN1: .WORD 0  ;NO. 1 HALF-BUFFER TRAN .WORD BUFF1 .WORD WBLOCK .WORD 4 .WORD 0 ;WHO DFLINK: .WORD 0 ;WHO .RAD50 /DFG/ ;WHO .WORD 1 ;WHO .RAD50 /DF/ ;WHO ; ;WHO .WORD 0 .PAGE ;WHO ; DOS I/O BLOCKS ;WHO .WORD 0 ;WHO DFLINK: .WORD 0 ;WHO .RAD50 /DFG/ ;WHO .WORD 1 ;WHO .RAD50 /DF/ ER TRAN .WORD BUFF2 .WORD WBLOCK .WORD 4,0 ;PROGRAM INITIALIZATION START: MOV #LNKP,-(SP) ; .INIT LNKP EMT 6 MOV #LNKK,-(SP) ; .INIT LNKK EMT 6 MOV #MSG1,-(SP) ; .WRITE MSG1 MOV #LNKP,-(SP) EMT 2 L10: MOV #MSG2,-(SP) ; .WRITE MSG2 MOV #LNKP,-(SP) EMT 2 MOV #LNKP,-(SP) ; .WAIT LNKP EMT 1 MOV #BUFF0,-(SP) ; .READ KEYBOARD MOV #LNKK,-(SP) EMT 4 MOV #LNKK,-(SP) ; .WAIT LNKK EMT 1 JSR PC,L40 ;CHECK INPUT BR L10 ,0 TRAN2: .WORD 0  ;NO. 2 HALF-BUFFER TRAN .WORD BUFF2 .WORD WBLOCK .WORD 4,0  ;PROGRAM INITIALIZATION START: MOV #LNKP,-(SP)  ; .INIT LNKP EMT 6 MOV #LNKK,-(SP)  ; .INIT LNKK EMT 6 MOV #MSG1,-(SP)  ; .WRITE MSG1 MOV #LNKP,-(SP) EMT 2 L10: MOV #MSG2,-(SP)  ; .WRITE MSG2 MOV #LNKP,-(SP) EMT 2 MOV #LNKP,-(SP)  ; .WAIT LNKP EMT 1 MOV #BUFF0,-(SP) ; .READ KEYBOARD MOV #LNKK,-(SP) EMT 4 MOV #LNKK,-(SP)  ; .WAIT LNKK EMT 1 J ;WHO LPLINK: .WORD 0 ;WHO .RAD50 /LPO/ ;WHO .WORD 1 ;WHO .RAD50 /LP/ ;WHO ; ;WHO TRAN: .WORD 1 ;WHO .W ;WHO ; ;WHO .WORD 0 ;WHO LPLINK: .WORD 0 ;WHO .RAD50 /LPO/ ;WHO .WORD 1 ;WHO .RAD50 /LP/ ;WHO ; ;ERROR. TRY AGAIN MOVB R0,LNK0U ;OK. SET INPUT UNIT L20: MOV #MSG3,-(SP) ; .WRITE MSG3 MOV #LNKP,-(SP) EMT 2 MOV #LNKP,-(SP) ; .WAIT LNKP EMT 1 MOV #BUFF0,-(SP) ; .READ KEYBOARD MOV #LNKK,-(SP) EMT 4 MOV #LNKK,-(SP) ; .WAIT LNKK EMT 1 JSR PC,L40 ;CHECK INPUT BR L20 ;ERROR. TRY AGAIN CMPB R0,LNK0U ;OK. SAME DRIVE AS INPUT? BNE L30 JSR PC,L50 ;YES. THATS A NO-NO! BR L20 L30: MOVB R0,LNK1U ;NO. SET OUTPUT UNIT MOV #MSG8,-(SPSR PC,L40  ;CHECK INPUT BR L10   ;ERROR. TRY AGAIN MOVB R0,LNK0U  ;OK. SET INPUT UNIT L20: MOV #MSG3,-(SP)  ; .WRITE MSG3 MOV #LNKP,-(SP) EMT 2 MOV #LNKP,-(SP)  ; .WAIT LNKP EMT 1 MOV #BUFF0,-(SP) ; .READ KEYBOARD MOV #LNKK,-(SP) EMT 4 MOV #LNKK,-(SP)  ; .WAIT LNKK EMT 1 JSR PC,L40  ;CHECK INPUT BR L20   ;ERROR. TRY AGAIN CMPB R0,LNK0U  ;OK. SAME DRIVE AS INPUT? BNE L30 JSR PC,L50  ;YES. THATS A NO-NO! BR L20 L30: MOVB R0,LNK1UORD MFDBUF ;WHO .WORD 100 ;WHO .WORD 4 ;WHO .WORD 0 ;WHO ; ;WHO LPHEAD: .WORD 200 ;WHO .WORD 6 ;WHO TRAN: .WORD 1 ;WHO .WORD MFDBUF ;WHO .WORD 100 ;WHO .WORD 4 ;WHO .WORD 0 ;WHO ; ) ; .WRITE MSG8 MOV #LNKP,-(SP) EMT 2 MOV #LNKP,-(SP) ; .WAIT LNKP EMT 1 MOV #BUFF0,-(SP) ; .READ KEYBOARD MOV #LNKK,-(SP) EMT 4 MOV #LNKK,-(SP) ; .WAIT LNKK EMT 1 CLR VERIFY CMPB #131,BUFF1 ;TEST FOR "Y"ES BNE L35 INC VERIFY ;SET TO VERIFY COPY L35: MOV #LNKK,-(SP) ; .RLSE LNKK EMT 7 MOV #LNK0,-(SP) ; .INIT LNK0 EMT 6 MOV #LNK1,-(SP) ; .INIT LNK1 EMT 6 CLR TRANF ;START AT BLOCK 0 CLR TRAN1 CLR TRAN2 JMP L100  ;NO. SET OUTPUT UNIT MOV #MSG8,-(SP)  ; .WRITE MSG8 MOV #LNKP,-(SP) EMT 2 MOV #LNKP,-(SP)  ; .WAIT LNKP EMT 1 MOV #BUFF0,-(SP) ; .READ KEYBOARD MOV #LNKK,-(SP) EMT 4 MOV #LNKK,-(SP)  ; .WAIT LNKK EMT 1 CLR VERIFY CMPB #131,BUFF1  ;TEST FOR "Y"ES BNE L35 INC VERIFY  ;SET TO VERIFY COPY L35: MOV #LNKK,-(SP)  ; .RLSE LNKK EMT 7 MOV #LNK0,-(SP)  ; .INIT LNK0 EMT 6 MOV #LNK1,-(SP)  ; .INIT LNK1 EMT 6 CLR TRANF  ;START AT BLOCK ;WHO .WORD 0 ;WHO .WORD 0 ;WHO ; ;WHO .WORD 0,2 ;WHO LPFILE: .RAD50 /WHO/ ; FILE BLOCK FOR LISTING ;WHO .RAD50 /DER/ ;WHO .RAD50 ;WHO LPHEAD: .WORD 200 ;WHO .WORD 6 ;WHO .WORD 0 ;WHO .WORD 0 ;WHO ; ;WHO .WORD 0,2 ;WHO LPFILE: .RAD50 /W ;HI-OH SILVER, AWAY... L40: MOVB BUFF1,R0 ;GET KEYBOARD CHARACTER SUB #60,R0 BMI L50 ; <0. ERROR CMP R0,#7 BGT L50 ; >7. ERROR ADD #2,(SP) ;OK. SKIP ERROR RETURN RTS PC ; & BACK WE GO L50: MOV #MSG4,-(SP) ;ERROR COMMENT (???) MOV #LNKP,-(SP) EMT 2 MOV #LNKP,-(SP) ; .WAIT LNKP EMT 1 RTS PC ;TAKE ERROR RETURN ;COPY SEQUENCE L100: MOV #TRANF+6,EWORD MOV #4,TRANF+6 ;READ FULL BUFFER MOV #TRANF,-(SP) ;FROM UNIT 0 0 CLR TRAN1 CLR TRAN2 MOV #HBUFSZ,TRANF+4 MOV #WBLOCK,TRAN1+4 MOV #WBLOCK,TRAN2+4 JMP L100  ;HI-OH SILVER, AWAY... L40: MOVB BUFF1,R0  ;GET KEYBOARD CHARACTER SUB #60,R0 BMI L50   ; <0. ERROR CMP R0,#7 BGT L50   ; >7. ERROR ADD #2,(SP)  ;OK. SKIP ERROR RETURN RTS PC   ; & BACK WE GO L50: MOV #MSG4,-(SP)  ;ERROR COMMENT (???) MOV #LNKP,-(SP) EMT 2 MOV #LNKP,-(SP)  ; .WAIT LNKP EMT 1 RTS PC   ;T/LST/ ;WHO .WORD 0 ;WHO .WORD 233 ;WHO .PAGE ;WHO ; BUFFERS ;WHO MFDBUF: .=.+200 ;MFD BUFFER ;WHO UFDBUF: .=.+200 ;UFD BUFFER HO/ ; FILE BLOCK FOR LISTING ;WHO .RAD50 /DER/ ;WHO .RAD50 /LST/ ;WHO .WORD 0 ;WHO .WORD 233 ;WHO .PAGE ;WHO ; BUFFERS MOV #LNK0,-(SP) EMT 10 MOV #LNK0,-(SP) ; .WAIT EMT 1 CLR UNIT ;CHECK FOR ERRORS JSR R5,ERROR1 BR L100 L110: MOV #2,TRANF+6 ;WRITE FULL BUFFER MOV #TRANF,-(SP) ;TO UNIT 1 MOV #LNK1,-(SP) EMT 10 MOV #LNK1,-(SP) ; .WAIT EMT 1 INC UNIT ;CHECK FOR ERRORS JSR R5,ERROR1 BR L110 ;VERIFY SEQUENCE TST VERIFY ;VERIFY? BNE L120 JMP L170 ;-- NO L120: CLR SWITCH ;-- YES. SET TO START MOV TRANF,TRAN1 MOV TRANF,TRAN2 MOVAKE ERROR RETURN  ;COPY SEQUENCE L100: MOV #TRANF+6,EWORD MOV #4,TRANF+6  ;READ FULL BUFFER MOV #TRANF,-(SP) ;FROM UNIT 0 MOV #LNK0,-(SP) EMT 10 MOV #LNK0,-(SP)  ; .WAIT EMT 1 CLR UNIT  ;CHECK FOR ERRORS JSR R5,ERROR1 BR L100 L110: MOV #2,TRANF+6  ;WRITE FULL BUFFER MOV #TRANF,-(SP) ;TO UNIT 1 MOV #LNK1,-(SP) EMT 10 MOV #LNK1,-(SP)  ; .WAIT EMT 1 INC UNIT  ;CHECK FOR ERRORS JSR R5,ERROR1 BR L110  ;VERIFY SEQUENCE TST ;WHO CURUIC: .WORD 0 ;CURRENT UIC ;WHO MAPLNK: .WORD 0 ;LINK TO NEX MAP ;WHO UICTOT: .WORD 0 ;BLOCKS FOR THIS UIC ;WHO ALLTOT: .WORD 0 ;TOTAL DISK BLOCKS ;WHO FREEB: .WORD 0 ; # SECTORS ON DEVICE NOT USED. :WHO DISIZE: .WORD 0 ; # SECTORS ON DEVICE ;WHO ; FORMATS ;WHO MFDBUF: .=.+200 ;MFD BUFFER ;WHO UFDBUF: .=.+200 ;UFD BUFFER ;WHO CURUIC: .WORD 0 ;CURRENT UIC ;WHO MAPLNK: .WORD 0 ;LINK TO NEX MAP ;WHO UICTOT: .WORD 0 ;BLOCKS FOR THIS UIC ;WHO ALLTOT: .WORD 0 ;TOTAL DISK BLOCKS ;WHO FREEB: .WORD 0 #TRAN1+6,EWORD L130: MOV #TRAN1,-(SP) ;READ ORIGINAL FROM 0 MOV #LNK0,-(SP) EMT 10 MOV #LNK0,-(SP) ; .WAIT EMT 1 CLR UNIT ;CHECK FOR ERRORS JSR R5,ERROR1 BR L130 MOV #TRAN2+6,EWORD L140: MOV #TRAN2,-(SP) ;READ COPY FROM 1 MOV #LNK1,-(SP) EMT 10 MOV #LNK1,-(SP) ; .WAIT EMT 1 INC UNIT ;CHECK FOR ERRORS JSR R5,ERROR1 BR L140 MOV #BUFF1,R0 ;SET UP COMPARE LOOP MOV #BUFF2,R1 MOV #-WBLOCK,R2 L150: CMP (R0)+,(R1)+ ;COMPARE BEQ L1 VERIFY  ;VERIFY? BNE L120 JMP L170  ;-- NO L120: CLR SWITCH  ;-- YES. SET TO START MOV TRANF,TRAN1 MOV TRANF,TRAN2 MOV #TRAN1+6,EWORD CMP TRANF,#575. BLT L130 MOV #256.*2,TRAN1+4 MOV #256.*2,TRAN2+4 L130: MOV #TRAN1,-(SP) ;READ ORIGINAL FROM 0 MOV #LNK0,-(SP) EMT 10 MOV #LNK0,-(SP)  ; .WAIT EMT 1 CLR UNIT  ;CHECK FOR ERRORS JSR R5,ERROR1 BR L130 MOV #TRAN2+6,EWORD L140: MOV #TRAN2,-(SP) ;READ C ;WHO DSKDIR: .BYTE 40,11,11,11,40,40,40 ;WHO .ASCII /DISK DIRECTORY / ;WHO TODAY: .=.+11 ;WHO .BYTE 12,12 ;WHO .ASCII / UIC T FILNAM.EXT DATE MODE / ;WHO .ASCII / START DLONG LAST PRO/ ; # SECTORS ON DEVICE NOT USED. :WHO DISIZE: .WORD 0 ; # SECTORS ON DEVICE ;WHO ; FORMATS ;WHO DSKDIR: .BYTE 40,11,11,11,40,40,40 ;WHO .ASCII /DISK DIRECTORY / ;WHO TODAY: .=.+11 ;WHO .BYTE 12,12 60 JMP ERROR2 ;OOPS! WE GOOFED. L160: INC R2 BNE L150 TST SWITCH ;ALL OK. BOTH HALF- BNE L170 ;BUFFERS TESTED YET? INC SWITCH ;-- NO. DO SECOND ONE. ADD #HBLK,TRAN1 ADD #HBLK,TRAN2 JMP L130 ;INCREMENT COPY BLOCKS OR END L170: ADD #FBLK,TRANF ;BUMP BLOCK NO. CMP TRANF,#512. ;DONE YET? BGE L180 ;-- NO. CONTINUE MOV #-5,VCOUNT JMP L100 L180: MOV #MSG7,-(SP) ;-- YES. TYPE END MESSAGE MOV #LNKP,-(SP) EMT 2 L190: CLR TRAN1 ;REOPY FROM 1 MOV #LNK1,-(SP) EMT 10 MOV #LNK1,-(SP)  ; .WAIT EMT 1 INC UNIT  ;CHECK FOR ERRORS JSR R5,ERROR1 BR L140 MOV #BUFF1,R0  ;SET UP COMPARE LOOP MOV #BUFF2,R1 MOV #-WBLOCK,R2 L150: CMP (R0)+,(R1)+  ;COMPARE BEQ L160 JMP ERROR2  ;OOPS! WE GOOFED. L160: INC R2 BNE L150 TST SWITCH  ;ALL OK. BOTH HALF- BNE L170  ;BUFFERS TESTED YET? INC SWITCH  ;-- NO. DO SECOND ONE. ADD #HBLK,TRAN1 ADD #HBLK,TRAN2 CMP TRAN2,#578. ;WHO .=.+3 ;WHO UICG: .=.+3 ;WHO .BYTE 54 ;WHO UICU: .=.+3 ;WHO .BYTE 15,11,40,40 ;WHO TYPE: .BYTE 0 ;WHO .BYTE 40,40,40 ;WHO .ASCII / UIC T FILNAM.EXT DATE MODE / ;WHO .ASCII / START DLONG LAST PRO/ ;WHO .=.+3 ;WHO UICG: .=.+3 ;WHO .BYTE 54 ;WHO UICU: .=.+3 ;WHO .BYTE 15,11,40,40 WIND UNIT 0 MOV #1,TRAN1+4 MOV #TRAN1,-(SP) MOV #LNK0,-(SP) EMT 10 MOV #TRAN1,-(SP) ;REWIND UNIT 1 MOV #LNK1,-(SP) EMT 10 MOV #LNK1,-(SP) ; .WAIT EMT 1 MOV #LNK0,-(SP) ; .RLSE LNK0 EMT 7 MOV #LNK1,-(SP) ; .RLSE LNK1 EMT 7 MOV #LNKP,-(SP) ; .WAIT FOR TTY EMT 1 MOV #LNKP,-(SP) ; .RLSE LNKP EMT 7 JMP START ;RESTART ;READ/WRITE ERROR CHECK ERROR1: TST @EWORD ;ERROR? BPL E1.20 INC TCOUNT ;-- YES BEQ E1.10 RTS BGE L180 JMP L130  ;INCREMENT COPY BLOCKS OR END L170: ADD #FBLK,TRANF  ;BUMP BLOCK NO. CMP TRANF,#578. BGE L180  ;-- NO. CONTINUE MOV #-5,VCOUNT CMP TRANF,#575. BLT L180-4 MOV #256.*2,TRANF+4 JMP L100 L180: MOV #MSG7,-(SP)  ;-- YES. TYPE END MESSAGE MOV #LNKP,-(SP) EMT 2 L190: CLR TRAN1  ;REWIND UNIT 0 MOV #1,TRAN1+4 MOV #TRAN1,-(SP) MOV #LNK0,-(SP) EMT 10 MOV #TRAN1,-(SP) ;REWIND UNI ;WHO FIL: .=.+3 ;WHO NAM: .=.+3 ;WHO .BYTE 56 ;WHO EXT: .=.+3 ;WHO .BYTE 40,40,40 ;WHO DATE: .=.+11 ;WHO TYPE: .BYTE 0 ;WHO .BYTE 40,40,40 ;WHO FIL: .=.+3 ;WHO NAM: .=.+3 ;WHO .BYTE 56 ;WHO EXT: .=.+3 R5 ;RETRY TRANSFER E1.10: ADD #60,UNIT ; 5 RETRIES ALREADY. MOVB UNIT,MSG5X ; TYPE ERROR NOTICE MOV #MSG5,-(SP) ; AND ABORT COPY. MOV #LNKP,-(SP) EMT 2 JMP L190 E1.20: MOV #-5,TCOUNT ;-- NO. RESET RETRY COUNT, TST (R5)+ ; BUMP RETURN BY 2, AND RTS R5 ; CONTINUE ;VERIFY ERROR HANDLER ERROR2: INC VCOUNT ;5 RETRIES YET? BEQ E2.20 JMP L100 ;-- NO. RECOPY BLOCK. E2.20: MOV #MSG6,-(SP) ;-- YES. TYPE ERROR NOTICE MOV #LNKP,-(SPT 1 MOV #LNK1,-(SP) EMT 10 MOV #LNK1,-(SP)  ; .WAIT EMT 1 MOV #LNK0,-(SP)  ; .RLSE LNK0 EMT 7 MOV #LNK1,-(SP)  ; .RLSE LNK1 EMT 7 MOV #LNKP,-(SP)  ; .WAIT FOR TTY EMT 1 MOV #LNKP,-(SP)  ; .RLSE LNKP EMT 7 JMP START  ;RESTART  ;READ/WRITE ERROR CHECK ERROR1: TST @EWORD  ;ERROR? BPL E1.20 INC TCOUNT  ;-- YES BEQ E1.10 RTS R5   ;RETRY TRANSFER E1.10: ADD #60,UNIT  ; 5 RETRIES ALREADY. MOVB UNIT,MSG5X  ; TYPE ERROR NOTI ;WHO .BYTE 40,40,40 ;WHO MODE: .=.+6 ;WHO .BYTE 40,40,40 ;WHO START: .=.+6 ;WHO .BYTE 40,40,40 ;WHO LENGTH: .=.+5 ;WHO .BYTE 40,40,40 ;WHO .BYTE 40,40,40 ;WHO DATE: .=.+11 ;WHO .BYTE 40,40,40 ;WHO MODE: .=.+6 ;WHO .BYTE 40,40,40 ;WHO START: .=.+6 ;WHO .BYTE 40,40,40 ) ; AND ABORT COPY. EMT 2 JMP L190 ;CONSOLE MESSAGES MSG1: .WORD 0,0 .WORD MSG1E-MSG1-6 .BYTE 15,12,12 .ASCII /DECTAPE COPY V001A/ .BYTE 15,12,12 MSG1E=. .EVEN MSG2: .WORD 0,0 .WORD MSG2E-MSG2-6 .ASCII /ORIGINAL ON UNIT / .BYTE 13 MSG2E=. .EVEN MSG3: .WORD 0,0 .WORD MSG3E-MSG3-6 .ASCII /COPY TO UNIT / .BYTE 13 MSG3E=. .EVEN MSG4: .WORD 0,0 .WORD MSG4E-MSG4-6 .ASCII /????/ .BYTE 15,12 MSG4E=. .EVEN MSG5: .CE MOV #MSG5,-(SP)  ; AND ABORT COPY. MOV #LNKP,-(SP) EMT 2 JMP L190 E1.20: MOV #-5,TCOUNT  ;-- NO. RESET RETRY COUNT, TST (R5)+  ; BUMP RETURN BY 2, AND RTS R5   ; CONTINUE  ;VERIFY ERROR HANDLER ERROR2: INC VCOUNT  ;5 RETRIES YET? BEQ E2.20 JMP L100  ;-- NO. RECOPY BLOCK. E2.20: MOV #MSG6,-(SP)  ;-- YES. TYPE ERROR NOTICE MOV #LNKP,-(SP)  ; AND ABORT COPY. EMT 2 JMP L190  ;CONSOLE MESSAGES MSG1: .WORD 0,0 .WORD MSG1E-MSG1- ;WHO LAST: .=.+6 ;WHO .BYTE 40,40,40 ;WHO PRO: .=.+3 ;WHO .BYTE 12 ;WHO TOTOUT: .ASCII / TOTAL BLOCKS/ ;WHO .BYTE 11,11,11,11,11,40 ;WHO ;WHO LENGTH: .=.+5 ;WHO .BYTE 40,40,40 ;WHO LAST: .=.+6 ;WHO .BYTE 40,40,40 ;WHO PRO: .=.+3 ;WHO .BYTE 12 ;WHO WORD 0,0 .WORD MSG5E-MSG5-6 .BYTE 15,12 .ASCII "*** I/O ERROR, UNIT " MSG5X: .BYTE 0,13 MSG5E=. .EVEN MSG6: .WORD 0,0 .WORD MSG6E-MSG6-6 .BYTE 15,12 .ASCII /*** UNRECOVERABLE COPY ERROR/ .BYTE 13 MSG6E=. .EVEN MSG7: .WORD 0,0 .WORD MSG7E-MSG7-6 .BYTE 15,12,12 .ASCII /COPY COMPLETED/ .BYTE 15,12 MSG7E=. .EVEN MSG8: .WORD 0,0 .WORD MSG8E-MSG8-6 .ASCII /VERIFY COPY (Y OR N)? / .BYTE 13 MSG8E=. .EVEN .END START 6 .BYTE 15,12,12 .ASCII /DECTAPE COPY / .ASCII /V01B/ .BYTE 15,12,12 MSG1E=. .EVEN MSG2: .WORD 0,0 .WORD MSG2E-MSG2-6 .ASCII /ORIGINAL ON UNIT / .BYTE 13 MSG2E=. .EVEN MSG3: .WORD 0,0 .WORD MSG3E-MSG3-6 .ASCII /COPY TO UNIT / .BYTE 13 MSG3E=. .EVEN MSG4: .WORD 0,0 .WORD MSG4E-MSG4-6 .ASCII /????/ .BYTE 15,12 MSG4E=. .EVEN MSG5: .WORD 0,0 .WORD MSG5E-MSG5-6 .BYTE 15,12 .ASCII "*** I/O ERROR, UNIT " MSG5X COUNT: .=.+5 ;WHO ALLUIC: .BYTE 12,12 ;WHO .ASCII /*******/ ;WHO .BYTE 12,12 ;WHO MAPMES: .BYTE 14,11,11,11 ;WHO .ASCII / DISK MAP / ;WHO MAPDAT: .=.+11 TOTOUT: .ASCII / TOTAL BLOCKS/ ;WHO .BYTE 11,11,11,11,11,40 ;WHO COUNT: .=.+5 ;WHO ALLUIC: .BYTE 12,12 ;WHO .ASCII /*******/ ;WHO .BYTE 12,12 ;WHO MAPMES: .BYTE 14,11,11,11 : .BYTE 0,13 MSG5E=. .EVEN MSG6: .WORD 0,0 .WORD MSG6E-MSG6-6 .BYTE 15,12 .ASCII /*** UNRECOVERABLE COPY ERROR/ .BYTE 13 MSG6E=. .EVEN MSG7: .WORD 0,0 .WORD MSG7E-MSG7-6 .BYTE 15,12,12 .ASCII /COPY COMPLETED/ .BYTE 15,12 MSG7E=. .EVEN MSG8: .WORD 0,0 .WORD MSG8E-MSG8-6 .ASCII /VERIFY COPY (Y OR N)? / .BYTE 13 MSG8E=. .EVEN .END START ;WHO .BYTE 12,12 ;WHO UCOUNT: .=.+5 ;WHO .ASCII / BLOCKS USED / ;WHO FCOUNT: .=.+5 ;WHO .ASCII / BLOCKS FREE/ ;WHO MAPLIN: .BYTE 15,12 ;WHO BLKN ;WHO .ASCII / DISK MAP / ;WHO MAPDAT: .=.+11 ;WHO .BYTE 12,12 ;WHO UCOUNT: .=.+5 ;WHO .ASCII / BLOCKS USED / ;WHO FCOUNT: .=.+5 ;WHO O: .=.+6 ;WHO .BYTE 40,40,40 ;WHO BITMAP: .=.+107 ;WHO .PAGE ;WHO ;GLOBAL SUBROUTINE TO DECODE MONITOR FORMAT DATE AND TIME INTO ;WHO ;AN ASCII STRING ;WHO ; VERSION OF MAY 23,1971 .ASCII / BLOCKS FREE/ ;WHO MAPLIN: .BYTE 15,12 ;WHO BLKNO: .=.+6 ;WHO .BYTE 40,40,40 ;WHO BITMAP: .=.+107 ;WHO .PAGE ;WHO ;GLOBAL SUBROUTINE TO DECODE MONITOR FORMAT DATE& :((x9P @ @ S,EE,:   ;WHO ;TO GET DAY CALL BY: ;WHO ; MOV JULDAT,-(SP) ;WHO ; JSR PC,JULDEC ;WHO ;WHERE JULDAT IS MONITOR FORMAT JULIAN DATE. THE DATE WILL BE ;WHO ;DECODED INTO A 9 CHARACTER ASCII STRING BEGINNING AT GLOBAL ;WHO ;TAG DAY. ;WHO ;FOR EITHE AND TIME INTO ;WHO ;AN ASCII STRING ;WHO ; VERSION OF MAY 23,1971 ;WHO ;TO GET DAY CALL BY: ;WHO ; MOV JULDAT,-(SP) ;WHO ; JSR PC,JULDEC ;WHO ;WHERE JULDAT IS MONITOR FORMAT JULIAN DATE. THE DATE WILL BE ;WHO ;DECODED INT<;<;􃴻 :<;P*P{,*REE*v  N;*@N; P{ Tl*^T|TTH;l',l 7TTH;$,ll v7k 7i*.TTH;ll7 ~YK*R~ ~l7 &7 ,7 *v2@ &,^@ @ 06 @ &0,"@ 0"" @" &0F.0 7X 0X"( .̀00 v7k 7iփ0 0(փ, 007 ~Y  00,~ ~0HR7 &7 ,7 R ENTRY,IF YOU WANT DAYTIME TO MOVE THE OUTPUT INTO ;WHO ;YOUR OWN BUFFER FOR YOU, PUSH THE ADDREES OF YOUR BUFFER ONTO ;WHO ;THE STACK AFTER THE TIME OR DATE AND JSR TO TICMOV OR ;WHO ;JULMOV. ;WHO .PAGE ;WHO ;SET UP RETURN ADDRESS, TRANSFER PARAMETERS, AND ARGUMENTS FOR ;WHO ;THE VARIOUS ENTRIES AND SAVE REGISTERS USED O A 9 CHARACTER ASCII STRING BEGINNING AT GLOBAL ;WHO ;TAG DAY. ;WHO ;FOR EITHER ENTRY,IF YOU WANT DAYTIME TO MOVE THE OUTPUT INTO ;WHO ;YOUR OWN BUFFER FOR YOU, PUSH THE ADDREES OF YOUR BUFFER ONTO ;WHO ;THE STACK AFTER THE TIME OR DATE AND JSR TO TICMOV OR ;WHO ;JULMOV. ;WHO .PAGE   $w(~0 *eTT~5.7 n~w :* N~w  <~w7 <~* "~-v?z[,.~7 ~w }H*T }w N;P{$*xw  } }e e -i*Bwe@-B }-?*,wT7 k.0HR`,:2@  $w(~0 ,^el`~l"`0ZHH7 n~w :Z ZHH*ZG,RR N~w  <~w7 <~ R R5,΁j"~-v?zE j.~dHH7 ~w t}nd ;WHO JULMOV: MOV (SP)+,EXDEC+2 ;WHO MOV (SP)+,YORBUF ;SET UP TRANSFER PARAMETERS ;WHO MOV #DAY,MYBUF ;WHO MOV #-12,NOCHAR ;WHO BR JULDEC+4 ;WHO JULDEC: MOV (SP)+,EXDEC+2 ;RETURN ADDRESS ;WHO MOV ;WHO ;SET UP RETURN ADDRESS, TRANSFER PARAMETERS, AND ARGUMENTS FOR ;WHO ;THE VARIOUS ENTRIES AND SAVE REGISTERS USED ;WHO JULMOV: MOV (SP)+,EXDEC+2 ;WHO MOV (SP)+,YORBUF ;SET UP TRANSFER PARAMETERS ;WHO MOV #DAY,MYBUF ;WHO MOV #-12,NOCHAR ;WHO BR JUTTn*w &} "}e0}},2Tw| |wfҾT*Xwv DECTAPE COPY V01B e*|ORIGINAL ON UNIT COPY T/*O UNIT ????  *** I/O *ľERROR, UNIT  *** UNRECOVERADBLE COPY ERROR a COPY COMPLETED #VERIFY COPY (Y OR N)? a HH"t(n,RR }w @$HR R @,<w  } }e e -,`Bwe@-B }-?.w7 dH$d(H0dRRHR!"d RRHR$*,҂w &} "}e0}}x &x.w| |(SP)+,JULDAT ;JU;IAN DATE ;WHO MOV R5,-(SP) ;SAVE REGISTERS ;WHO MOV R4,-(SP) ;WHO MOV R3,-(SP) ;WHO .PAGE ;WHO ; DECODE THE DATE ;WHO MOV JULDAT,-(SP) ;BIN2D THE JULIAN DATE LDEC+4 ;WHO JULDEC: MOV (SP)+,EXDEC+2 ;RETURN ADDRESS ;WHO MOV (SP)+,JULDAT ;JU;IAN DATE ;WHO MOV R5,-(SP) ;SAVE REGISTERS ;WHO MOV R4,-(SP) ;WHO MOV R3,-(SP) ;WHO .PAGE ; OUTPUT BLOCK TO DISK FROM MAIN BUFFERS -- JSR PC,IT.WRZ: ; EXPECTS BLOCK NO ON TOP OF STACK. ON EXIT ; NEXT BUFFER IS ZEROED READY FOR REFILL IT.WRZ: MOV IT.OBF,R2 ; GET BUFFER START MOV 2(SP),-(SP) ; SET BLOCK # FOR GEN WRT JSR PC,IT.WRT ; ... & CALL IT ADD #IT.OB2-IT.OB1,R2 ; OTHER BUFFER NOW USABLE CMP R2,#IT.OB2 ; SO SET PTR TO IT BEQ .+6 MOV #IT.OB1,R2 MOV R2,IT.OBF ; SAVE IT ADD #IT.OB2-IT.OB1,R2 ; BUMP TO END CLR -(R2)  ; ... & CLEAR IN REVERSE wf$(K,wv DECTAPE COPY V01B ,@ORIGINAL ON UNIT COPY T,dO UNIT ????  *** I/O B,ERROR, UNIT  *** UNRECOVERABLE COPY ERROR  ! COPY COMPLETED Y փ%փVERIFY COPY (Y OR N)?  r ;WHO MOV #YEAR,-(SP) ;INTO YEAR FORMAT WHERE ONLY ;WHO MOV #3,-(SP) ;FIRST 2 BYTES WILL BE TRANSFERRED ;WHO EMT 42 ;WHO ADD #7,YEAR ;DON'T FORGET OFFSET ;WHO MOV #YEAR+2,-(SP) ;D2BIN ONLY THE LAST 3 DIGITS OF ;WHO MOV #2,-(SP) ;THE JULIAN DATE ;WHO EMT 42 ;WHO ; DECODE THE DATE ;WHO MOV JULDAT,-(SP) ;BIN2D THE JULIAN DATE ;WHO MOV #YEAR,-(SP) ;INTO YEAR FORMAT WHERE ONLY ;WHO MOV #3,-(SP) ;FIRST 2 BYTES WILL BE TRANSFERRED ;WHO EMT 42 ;WHO ADD #7,YEAR ;DON'T FORGET OFFSET ;WHO MOV #YEAR+2,CMP R2,IT.OBF BNE .-6 MOV (SP)+,@SP ; CLEAR STACK IT.RTN: RTS PC  ; GO REFILL .PAGE ; MAIN CONTROL ROUTINE: ZERO: .WORD 0 ; A WORD OF NOTHING? ; START = . ; BEGIN OF PROGRAM. ; MOV #IT.OB1,#0 ; SET UP FIRST OUTPUT BUFFER. IT.OBF=.-2   ; (1ST OUTPUT IS BOOT!!) MOV #IT.OUL,-(SP) ; INIT OUTPUT EMT 6 ; ; DETERMINE DISK SIZE: ; IT.CSR = 165300 ; DDS DISK STATUS REG. IT.WC = 1 ;WHO MOV (SP)+,R5 ;BINARY DAY COUNT ;WHO TST (SP)+ ;CLEAR STACK ;WHO MOV #CALNDR,R4 ;POINT TO CALANDER ;WHO MONSEL: MOV (R4)+,-(SP) ;UNPACK NAME OF MONTH ;WHO MOV #MONTH,-(SP) ;WHO MOV #1,-(SP) -(SP) ;D2BIN ONLY THE LAST 3 DIGITS OF ;WHO MOV #2,-(SP) ;THE JULIAN DATE ;WHO EMT 42 ;WHO MOV (SP)+,R5 ;BINARY DAY COUNT ;WHO TST (SP)+ ;CLEAR STACK ;WHO MOV #CALNDR,R4 ;POINT TO CALANDER ;WHO MONSEL: MOV (R4)+,-(SP) ;UNPACK NAME OF MONTH 65302 ; WORD COUNT REG. IT.CMA = 165304 ; CURRENT MEMORY REGISTER. IT.DAR = 165306 ; DISK ADDRESS REGISTER IT.DER = 165310 ; ERROR REGISTER ; CLR R5 ; CLEAR SECTOR COUNTER. MOV #IT.CSR,R4 ; SET PTR TO DISK CONTROL MOV #400,@R4 ; ENSURE DISK CLEAR MOV #IT.CSR+6,R3 ; SET PTR TO SECTOR ADD. REG. IT.DTL: ADD #4000,R5 ; INCREMENT SEC. COUNT BY 1K MOV R5,@R3 ; W DKDR ; DKDR MFDBLK =1 ; DISK ADDRESS OF MFD BLOCK #1. DKDR ; DKDR .PAGE DKDR .GLOBL DK ; DKDR ; STANDARD DRIVER TABLE DKDR DK: .WORD 0  ;WHO EMT 42 ;WHO MOV R5,-(SP) ;BIN2D DAY COUNT ;WHO MOV #DAY-3,-(SP) ;LAST 2 DIGITS IN DAY ;WHO MOV #3,-(SP) ;WHO EMT 42 ;WHO SUB (R4)+,R5 ;BUT DO WE HAVE THE RIGHT MONTH? ;WHO BGT MONSEL  ;WHO MOV #MONTH,-(SP) ;WHO MOV #1,-(SP) ;WHO EMT 42 ;WHO MOV R5,-(SP) ;BIN2D DAY COUNT ;WHO MOV #DAY-3,-(SP) ;LAST 2 DIGITS IN DAY ;WHO MOV #3,-(SP) ;WHO EMT 42 ILL DISK RESPOND TO THIS ADD? MOV #1,@R4 ; NO-OP AND GO FUNCTION BIT #4000,@R4 ; IS IT THERE OR NON-EXISTANT? BEQ IT.DTL ; ITS THERE, KEEP LOOKING MOV R5,R3 ; ALL DONE. SAVE COUNT IN R3. MOV #400,@R4 ; CLEAR THE DISK ; ; CLEAR THE DISK TO ALL ZEROS. ; CLR R1  ; SET BLOCK COUNTER IT.CDF: MOV #400,@#IT.DER ; SET CMA INHIBIT TO DO ALL XFER FROM ; ONE; CURRENT DDB ADDRESS & BUSY FLAG DKDR .WORD 100037 ; FACILITY INDICATOR: DKDR ; FILE STRUCTURED DKDR ; ASCII DEVICE DKDR ; BINARY DEVICE DKDR ; INPUT DEVICE DKDR ; OUTPUT DEVICE DK  ;IF NOT TRY NEXT MONTH ;WHO .PAGE ;WHO ;PERFORM TRANSFER IF REQUESTED AND EXIT ;WHO MOV MYBUF,R4 ;SOURCE BUFFER ;WHO MOV YORBUF,R5 ;DESTINATION BUFFER ;WHO MOCHAR: INC NOCHAR ;REMAINING CHARACTERS TO MOVE ;WHO BPL REGRES ;EXIT IF NONE  ;WHO SUB (R4)+,R5 ;BUT DO WE HAVE THE RIGHT MONTH? ;WHO BGT MONSEL ;IF NOT TRY NEXT MONTH ;WHO .PAGE ;WHO ;PERFORM TRANSFER IF REQUESTED AND EXIT ;WHO MOV MYBUF,R4 ;SOURCE BUFFER ;WHO MOV YORBUF,R5 ;DESTINATION BUFFER  WORD. MOV #ZERO,@#IT.CMA ; SET ADDRESS OF WORD OF ZEROS. MOV #-64.*1024.,@#IT.WC ; SET 1K SECTOR WORD COUNT MOV R1,@#IT.DAR ; SET SECTOR ADDRESS. MOV #3,@R4 ;SET WRITE AND GO FUNCTIONS. A10: TSTB @R4 ; WAIT FOR DONE BIT. BPL A10 ; TST @R4 ; CHECK FOR ERRORS. BPL A20 ; NONE. MOV @R4,-(SP) ; PUT STATUS REG ON STACK FOR E DR ; MULTIPLE USER DEVICE DKDR .BYTE 4 ; NUMBER OF 16 WORD BLOCKS IN BUFFER DKDR .BYTE INTHD-DK ; OFFSET - INTERRUPT HANDLER (INTHD). DKDR .BYTE INTPRT ; PRIORITY LEVEL OF INTERRUPT (5). DKDR .BYTE 0 ; OFFSET - OPEN HANDLER DKDR .BYTE TRAN-DK ; OFFSET - TRANSFER ROUTINE DKDR .BYTE 0 ; OFFS  ;WHO MOVB (R4)+,(R5)+ ;WHO BR MOCHAR ;WHO REGRES: MOV (SP)+,R3 ;WHO MOV (SP)+,R4 ;WHO MOV (SP)+,R5 ;WHO EXDEC: MOV #0,PC ;WHO .PAGE ;WHO MOCHAR: INC NOCHAR ;REMAINING CHARACTERS TO MOVE ;WHO BPL REGRES ;EXIT IF NONE ;WHO MOVB (R4)+,(R5)+ ;WHO BR MOCHAR ;WHO REGRES: MOV (SP)+,R3 ;WHO MOV (SP)+,R4 ;WHO MOV (SP)+,R5 RROR MOV #1426,-(SP) ; SET UP AN F26 ERROR VIA DOS IOT ; GO DO ERROR NEVER RETURN. A20: ADD #1024.,R1 ; INCREMENT SECTOR COUNT. CMP R1,R5 ; DONE YET. BLO IT.CDF ; NOT YET. ; PREPARE SET UP PERMANENT BIT MAPS: CLR R4  ; CALCULATE NO. BM REQD INC R4  ; RESULT IN R4 SUB #960.,R5 BCC .-6 ADD #960.,R5 ; REMAINDER IN R5 ASR R5  ; REDUCE TO BM BYTES ASR R5 ASR R5 ET - CLOSE HANDLER DKDR .BYTE 0 ; OFFSET - SPECIAL HANDLER DKDR .BYTE 0 ; UNUSED DKDR .RAD50 /DK/ ; DEVICE NAME DKDR .WORD MFDBLK ; SECTOR ADDRESS OF MFD BLOCK #1. DKDR .WORD 0 ; USED BY DOS TO POINT TO CORE BIT MAP DKDR ; SEGMENT. DKDR  ;WHO ; STORAGE ;WHO JULDAT: .WORD 0 ;WHO MYBUF: .WORD 0 ;WHO YORBUF: .WORD 0 ;WHO NOCHAR: .WORD 0 ;WHO CALNDR: .RAD50 /JAN/ ;WHO ;WHO EXDEC: MOV #0,PC ;WHO .PAGE ;WHO ; STORAGE ;WHO JULDAT: .WORD 0 ;WHO MYBUF: .WORD 0 ;WHO YORBUF: .WORD 0 ;WHO  SUB R4,R3  ; START BM BLOCK MOV R3,R0  ; AGAIN SAVE FOR LATER .PAGE ; DO ALL MAPS BUT LAST: MOV IT.OBF,R2 ;SET UP R2 WITH BUFFER ADDRESS MOV #3,8.(R2) ; SET BLOCKS 0 & 1 IN USE. CLR R1 ; CLEAR MAP # COUNTER IT.BMG: MOV R3,-(SP) ; SAVE BLOCK NO. FOR WRITE INC R3  ; STEP FOR LINK INC R1  ; SET MAP NO. MOV R3,(R2)+ ; STORE BOTH AT MAP START MOV R1,(R2)+ MOV #60.,(R2)+ ; FOLLOWED BY MAP SIZE  .PAGE DKDR ; THIS CODE INITIATES EACH TRANSFER, EITHER FROM DOS OR ON AN ATTEMPTED DKDR ; ERROR RECOVERY. DKDR TRAN: MOV #001,RTCONT ; RESET RETRY COUNTER ALLOWS 16 TRYS DKDR ; TWICE. USED IFF CRC OR MISSED TRAN. DKDR MOV PC,R3 ; SET UP TRANSFER VECTOR HERE BECAUSE DKDR ADD #DK-.,R3 ; NOT SAME A .WORD 37 ;WHO .RAD50 /FEB/ ;WHO .WORD 34 ;WHO .RAD50 /MAR/ ;WHO .WORD 37 ;WHO .RAD50 /APR/ ;WHO .WORD 36 NOCHAR: .WORD 0 ;WHO CALNDR: .RAD50 /JAN/ ;WHO .WORD 37 ;WHO .RAD50 /FEB/ ;WHO .WORD 34 ;WHO .RAD50 /MAR/ ;WHO .WORD 37 MOV R0,@R2 ; ... & 1ST MAP NO. DEC R4  ; AT LAST MAP? BEQ IT.BMD JSR PC,IT.WRZ ; IF NOT WRITE OUT BR IT.BMG ; NOW DO LAST MAP: IT.BMD: CLR -6(R2)  ; SCRUB LAST LINK MOV #100000,R4 ; SET MASK ADD R5,R2  ; GET TRUE MAP END MOV R2,R1 ASR R5 SUB #60.,R5  ; ... & SET UNUSED WORD CNT MOV R3,-(SP) ; SET BLOCK POINTER IT.BML: DEC @SP  ; DROP IT BIS R4,@R1  ; MARK IT IN MAP ASR R4  ; ADJUST MASK BCC 10$ ; ACROSS WORDS IF DDRESS AS DOS' DK. MUST BE DKDR MOVB 5(R3),R4 ; PIC. FIRST COMPUTE ADDRESS OF DRIVER DKDR ADD R3,R4 ; TABLE IN R3. THEN COMPUTE ADDRESS OF DKDR MOV R4,@#TV ; INTERRUPT HANDLER IN R4. FINALLY DKDR MOV #INTPRT,@#TV+2 ; STORE R4 IN VECTOR AND PRIORITY IN DKDR ; VECTOR+2. DKDR REPEAT: MOVB @PC,@#DCS+1 ; RESET ALL DISK REGISTERS. USES THE DKDR  ;WHO .RAD50 /MAY/ ;WHO .WORD 37 ;WHO .RAD50 /JUN/ ;WHO .WORD 36 ;WHO .RAD50 /JUL/ ;WHO .WORD 37 ;WHO  ;WHO .RAD50 /APR/ ;WHO .WORD 36 ;WHO .RAD50 /MAY/ ;WHO .WORD 37 ;WHO .RAD50 /JUN/ ;WHO .WORD 36 ;WHO NEC. MOV #100000,R4 ; RESET MARKER BIT TST -(R1) 10$: ; CMP @SP,R0  ; BACK AT 1ST MAP BLOCK? BGE IT.BML  ; ALLOWING FOR MFD #2 CMP (R2)+,(SP)+ COM (R2)+  ; FILL UNUSED MAP SECTION INC R5 BNE .-4 JSR PC,IT.WRZ ; ... & WRITE OUT .PAGE ; BUILD MFD BLOCK #1: MOV R0,@R2  ; SET LINK TO MFD #2 DEC @R2 MOV (R2)+,-(SP) ; SAVE FOR LATER MOV #5,(R2)+ ; INTERLEAVE FACTOR MOV R0,(R2)+ ; SET 1ST MAP NO.  ; ODD ADDRESS 1 TO SET BIT 8 IN DCS. DKDR MOV DK,R1 ; GET ADDRESS OF DDB BLOCK. DKDR CMP (R1)+,(R1)+ ; BUMP POINTER TO SECTOR ADDRESS WORD. DKDR MOV #DER,R0 ; SET R0 TO POINT DER (DCS+10). DKDR MOV (R1)+,-(R0) ; STORE SECTOR ADDRESS IN DAR (DCS+6) DKDR MOV (R1)+,-(R0) ; STORE MEMORY ADDRESS IN CMA(DCS+4) DKDR MOV (R1)+,-(R0) ; STORE BUFFER SI .RAD50 /AUG/ ;WHO .WORD 37 ;WHO .RAD50 /SEP/ ;WHO .WORD 36 ;WHO .RAD50 /OCT/ ;WHO .WORD 37 ;WHO .RAD50 /NOV/  .RAD50 /JUL/ ;WHO .WORD 37 ;WHO .RAD50 /AUG/ ;WHO .WORD 37 ;WHO .RAD50 /SEP/ ;WHO .WORD 36 ;WHO .RAD50 /OCT/  MOV R0,(R2)+ ; FOLLOWED BY LIST INC R0 CMP R0,R3 BNE .-6 MOV #1,-(SP) JSR PC,IT.WRZ ; BUILD MFD BLOCK #2: CLR (R2)+  ; ZERO LINK MOV #401,(R2)+ ; MONITOR UIC = 1,1 CLR (R2)+ ; NO UFD ASSIGNED YET. MOV #9.,(R2)+ ; NO. OF ENTRIES/UFD CLR (R2)+ JSR PC,IT.WRZ ; WRITE OUT MOV #IT.OUL,-(SP) ; RELEASE THE OUTPUT DATASET EMT 7 EMT 60 .PAGE ; DATA AREAS: ; A) BUFFER SPACE: IT.OB1:   ZE (2S COMPLEMENT) IN DKDR ; WC (DCS+2) DKDR MOV (R1),R2 ; GET FUNCTION (READ,WRITE) DKDR BIC #177771,R2 ; CLEAR ALL OTHER JUNK OUT. DKDR BIS #101,R2 ; SET INTERRUPT ENABLE(BIT 6) & GO(BIT0)DKDR MOV R2,-(R0) ; AND STORE IN DCS. DKDR RTS PC ; RETURN TO MONITOR PENDING AN INTERRUPTDKDR .PAGE ! ;WHO .WORD 36 ;WHO .RAD50 /DEC/ ;WHO .WORD 37 ;WHO .RAD50 /WHO/ ;WHO .WORD 1440 ;WHO .PAGE ;WHO ; FO" ;WHO .WORD 37 ;WHO .RAD50 /NOV/ ;WHO .WORD 36 ;WHO .RAD50 /DEC/ ;WHO .WORD 37 ;WHO .RAD50 /WHO/ ;WHO .WOR ; OUTPUT .=.+200 IT.OB2: .=.+200 ; ; B) LINK BLOCKS: IT.OUL: .WORD 0,0,1 .RAD50 /DK/ ; DEVICE CODE ; D) OUTPUT TRAN BLOCK: IT.OUB: .WORD 0,0,64.,2,0 ; .END START ; THE END AND THE BEGINNING. $ DKDR ; DKDR ; DKDR ; INTERRUPT SERVICE ROUTINE. DKDR INTHD: MOV @#44,-(SP) ; PUT ADDRESS OF REG SAVE ROUTINE ON DKDR JSR R5,@(SP)+ ; STACK FOR PIC JSR. DKDR MOV #DCS,R1 ; GET ADDRESS OF DCS %RMATS ;WHO .EVEN ;WHO .=.+3 ;WHO DAY: .=.+2 ;WHO .BYTE 40 ;WHO MONTH: .=.+3 ;WHO .BYTE 40 &D 1440 ;WHO .PAGE ;WHO ; FORMATS ;WHO .EVEN ;WHO .=.+3 ;WHO DAY: .=.+2 ;WHO .BYTE 40 .(hF.PVeĜ`Y.&XZߓQ$```BEUA.L$^ B 5 4,r &^ U 7 rf( DKDR MOV DK,R0 ; GET ADDRESS OF DDB FOR COMPLETION EXITDKDR MOV (R1),R2 ; GET DCS INTO R2 DKDR BMI ERR ; BRANCH IF ERROR CAUSED INTERRUPT. DKDR EXIT: MOV 14(R0),PC ; ELSE TAKE COMPLETION EXIT VIA DDB DKDR ; DKDR ; ERROR HANDLER. DKDR ; ) ;WHO YEAR: .=.+5 ;WHO .BYTE 15 ;WHO .END INIT ;WHO * ;WHO MONTH: .=.+3 ;WHO .BYTE 40 ;WHO YEAR: .=.+5 ;WHO .BYTE 15 ;WHO .END INIT ;WHO +; UPDATE 10/27/72 DDCINT.S02 ; UPDATE TO DEC'S SYSLOD (V1A) TO INIT DDC DISK FOR DOS AT DDS. .TITLE DDCINT R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ; THIS PROGRAM WILL INIT A DDC TYPE DISK FOR DOS USE FROM 2K TO 16K ; SECTORS IN SIZE. IT SETS UP THE BIT MAPS, MFD #1 & 2, UIC [1,1] AND ; ZERO'S THE DISK. THE DISK IS NOT A SYSTEM DEVICE AND HAS NO BOOT NOR ; MONLIB FILE ON IT. THE DEVICE CODE FOR DDC DISKS IS 'DK'. ; ; ;THIS IS A REVISED VERSION INCO, DKDR ERR: BIT #11000,R2 ; IS CRC(BIT 12) OR MISSED TRAN.(BIT 9) DKDR BEQ FATAL ; SET? IF NOT USE F 26 ERROR TO ABORT. DKDR ASL (PC)+ ; YES. HAVE WE RETRIED 16 TIMES YET? DKDR RTCONT: .WORD 0 ; (RETRY COUNTER) DKDR BCS ERR10 ; IF SO, RETURN VIA COMPLETION EXIT. DKDR JSR PC,REPEAT ; OTHERWISE, TRY AGAIN. /RPORATING A DOUBLE-BUFFER ; SCHEME FOR INPUT & OUTPUT TO SPEED UP THE DISK ; LOADING PROCESS. BECAUSE INPUT USES .READ, EACH ; BUFFER HAS ITS OWN HEADER AND THERE IS THUS NO ; NEED FOR .WAIT BETWEEN SUCCESSIVE READ ; OPERATIONS, I.E. THE SECOND READ BECOMES IMPLIED ; WAIT & ON RETURN FROM THIS, PROCESSING OF THE ; FIRST READ CAN BE BEGUN SAFELY. OUTPUT HOWEVER ; USES .TRAN WITH THE SAME CONTROL BLOCK ; FOR ALL ITS BUFFERS. ; .WAIT IS THEREFORE ESSENTIAL BEFORE EACH OUTPUT ; IN ORDER 0 DKDR RETURN: MOV @#46,-(SP) ; FIRST MUST RESTORE REGISTERS VIA DOS DKDR JSR R5,@(SP)+ ; RESTORATION ROUTINE. DKDR RTI ; THEN DO RTI. DKDR ERR10: BIS #100000,12(R0) ; INDICATE PARITY ERROR DKDR TST @#WC ; IS WC=0? IF SO AT BLOCK END. DKDR BEQ EXIT ; RETURN VIA COMPLETION EXIT (FLAG SET) DKDR 1; UPDATE 12/18/72 DDCINT.S03 ; UPDATE 10/27/72 DDCINT.S02 ; UPDATE TO DEC'S SYSLOD (V1A) TO INIT DDC DISK FOR DOS AT DDS. .TITLE DDCINT R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ; THIS PROGRAM WILL INIT A DDC TYPE DISK FOR DOS USE FROM 2K TO 16K ; SECTORS IN SIZE. IT SETS UP THE BIT MAPS, MFD #1 & 2, UIC [1,1] AND ; ZERO'S THE DISK. THE DISK IS NOT A SYSTEM DEVICE AND HAS NO BOOT NOR ; MONLIB FILE ON IT. THE DEVICE CODE FOR DDC DISKS IS 'r,PVeĜ`^,&XZߓQ$```BEUA,L$^ B 5 9*r &^ U 7 rf3TO BE ABLE TO SET UP THE .TRAN BLOCK ; ONLY WHEN THE PREVIOUS OPERATION HAS BEEN DONE. .PAGE ; GENERAL WRITE ROUTINE -- JSR PC,IT.WRT: ; EXPECTS BLOCK # ON STACK TOP & BUFF ADDR IN R2 IT.WRT: MOV #IT.OUL,-(SP) ; WAIT IN CASE BUSY EMT 1 MOV 2(SP),IT.OUB ; SET TRAN BLOCK ... MOV R2,IT.OUB+2 ; ... BLOCK & BUFF ADDR MOV #IT.OUB,-(SP) ; DO .TRAN MOV #IT.OUL,-(SP) EMT 10 MOV (SP)+,@SP ; HOUSEKEEP STACK RTS PC ; ; OUTPUT BLOCK TO DISK FROM MAIN BUFFERS -- 4 ; OTHERWISE, USE ERROR RETURN SINCE WE DKDR ; CAN'T RECOVER AND ONLY PARTIAL BLOCK DKDR ; TRANSFERED. DKDR FATAL: CLR DK ; FREE DRIVER FOR OTHER USERS DKDR MOV (R1),-(SP) ; PUT DCS ON STACK FOR CONSOLE PRINTOUT.DKDR MOV #1426,-(SP) ; PUT ERROR CODE ON STACK(= F 26). DKDR IOT ; GO TO DOS DIAGNOSTIC ROUTINE. SIN5DK'. ; ; ;THIS IS A REVISED VERSION INCORPORATING A DOUBLE-BUFFER ; SCHEME FOR INPUT & OUTPUT TO SPEED UP THE DISK ; LOADING PROCESS. BECAUSE INPUT USES .READ, EACH ; BUFFER HAS ITS OWN HEADER AND THERE IS THUS NO ; NEED FOR .WAIT BETWEEN SUCCESSIVE READ ; OPERATIONS, I.E. THE SECOND READ BECOMES IMPLIED ; WAIT & ON RETURN FROM THIS, PROCESSING OF THE ; FIRST READ CAN BE BEGUN SAFELY. OUTPUT HOWEVER ; USES .TRAN WITH THE SAME CONTROL BLOCK ; FOR ALL ITS BUFFERS. ; .WAIT IS THEREFORE ESSENTIA6&:(j(N.XTR`X0iX`X.& e Xe" X.LXX eKXX".r5C L_ L.̋ &eE  e.   R<.   02 Ba < Q .  #$R   7JSR PC,IT.WRZ: ; EXPECTS BLOCK NO ON TOP OF STACK. ON EXIT ; NEXT BUFFER IS ZEROED READY FOR REFILL IT.WRZ: MOV IT.OBF,R2 ; GET BUFFER START MOV 2(SP),-(SP) ; SET BLOCK # FOR GEN WRT JSR PC,IT.WRT ; ... & CALL IT ADD #IT.OB2-IT.OB1,R2 ; OTHER BUFFER NOW USABLE CMP R2,#IT.OB2 ; SO SET PTR TO IT BEQ .+6 MOV #IT.OB1,R2 MOV R2,IT.OBF ; SAVE IT ADD #IT.OB2-IT.OB1,R2 ; BUMP TO END CLR -(R2)  ; ... & CLEAR IN REVERSE CMP R2,IT.OBF BNE .-6 MOV (SP)+,CE DKDR .END ; FATAL WILL NEVER RETURN. DKDR 9L BEFORE EACH OUTPUT ; IN ORDER TO BE ABLE TO SET UP THE .TRAN BLOCK ; ONLY WHEN THE PREVIOUS OPERATION HAS BEEN DONE. .PAGE ; GENERAL WRITE ROUTINE -- JSR PC,IT.WRT: ; EXPECTS BLOCK # ON STACK TOP & BUFF ADDR IN R2 IT.WRT: MOV #IT.OUL,-(SP) ; WAIT IN CASE BUSY EMT 1 MOV 2(SP),IT.OUB ; SET TRAN BLOCK ... MOV R2,IT.OUB+2 ; ... BLOCK & BUFF ADDR MOV #IT.OUB,-(SP) ; DO .TRAN MOV #IT.OUL,-(SP) EMT 10 MOV (SP)+,@SP ; HOUSEKEEP STACK RTS PC ; ; OUTPUT BLOCK TO DISK FROM MAIN BUF.0       X; &Xp V0 XXx@ ;@SP ; CLEAR STACK IT.RTN: RTS PC  ; GO REFILL .PAGE ; MAIN CONTROL ROUTINE: ZERO: .WORD 0 ; A WORD OF NOTHING? ; START = . ; BEGIN OF PROGRAM. ; MOV #IT.OB1,#0 ; SET UP FIRST OUTPUT BUFFER. IT.OBF=.-2   ; (1ST OUTPUT IS BOOT!!) MOV #IT.OUL,-(SP) ; INIT OUTPUT EMT 6 ; ; DETERMINE DISK SIZE: ; IT.CSR = 165300 ; DDS DISK STATUS REG. IT.WC = 165302 ; WORD COUNT REG. IT.CMA ${ {j{:tT ,{}TR}}0*,{ e n}|e" },{|} eK,|5C {_,.|̋ &eE  e,T|   R<,z|   02 Ba < Q ,| #$R   ,|       }|0}x@{=FERS -- JSR PC,IT.WRZ: ; EXPECTS BLOCK NO ON TOP OF STACK. ON EXIT ; NEXT BUFFER IS ZEROED READY FOR REFILL IT.WRZ: MOV IT.OBF,R2 ; GET BUFFER START MOV 2(SP),-(SP) ; SET BLOCK # FOR GEN WRT JSR PC,IT.WRT ; ... & CALL IT ADD #IT.OB2-IT.OB1,R2 ; OTHER BUFFER NOW USABLE CMP R2,#IT.OB2 ; SO SET PTR TO IT BEQ .+6 MOV #IT.OB1,R2 MOV R2,IT.OBF ; SAVE IT ADD #IT.OB2-IT.OB1,R2 ; BUMP TO END CLR -(R2) ; ... & CLEAR IN REVERSE CMP R2,IT.OBF BNE .-6 MOV (SP)+,@SP ; CLEAR STACK IT.RTN: RT? = 165304 ; CURRENT MEMORY REGISTER. IT.DAR = 165306 ; DISK ADDRESS REGISTER IT.DER = 165310 ; ERROR REGISTER ; CLR R5 ; CLEAR SECTOR COUNTER. MOV #IT.CSR,R4 ; SET PTR TO DISK CONTROL MOV #400,@R4 ; ENSURE DISK CLEAR MOV #IT.CSR+6,R3 ; SET PTR TO SECTOR ADD. REG. IT.DTL: ADD #4000,R5 ; INCREMENT SEC. COUNT BY 1K MOV R5,@R3 ; WILL DISK RESPOND TO THIS ADD? MOVAS PC ; GO REFILL .PAGE ; MAIN CONTROL ROUTINE: ZERO: .WORD 0 ; A WORD OF NOTHING? ; START = . ; BEGIN OF PROGRAM. ; MOV #IT.OB1,#0 ; SET UP FIRST OUTPUT BUFFER. IT.OBF=.-2 ; (1ST OUTPUT IS BOOT!!) MOV #IT.OUL,-(SP) ; INIT OUTPUT EMT 6 ; ; DETERMINE DISK SIZE: ; IT.CSR = 165300 ; DDS DISK STATUS REG. IT.WC = 165302 ; WORD COUNT REG. IT.CMA = 165304 ; CURRENT MEMORY C #1,@R4 ; NO-OP AND GO FUNCTION BIT #4000,@R4 ; IS IT THERE OR NON-EXISTANT? BEQ IT.DTL ; ITS THERE, KEEP LOOKING MOV R5,R3 ; ALL DONE. SAVE COUNT IN R3. MOV #400,@R4 ; CLEAR THE DISK ; ; CLEAR THE DISK TO ALL ZEROS. ; CLR R1  ; SET BLOCK COUNTER IT.CDF: MOV #400,@#IT.DER ; SET CMA INHIBIT TO DO ALL XFER FROM ; ONE WORD. MOV #ZERO,@#IT.CMA ;EREGISTER. IT.DAR = 165306 ; DISK ADDRESS REGISTER IT.DER = 165310 ; ERROR REGISTER ; CLR R5 ; CLEAR SECTOR COUNTER. MOV #IT.CSR,R4 ; SET PTR TO DISK CONTROL MOV #400,@R4 ; ENSURE DISK CLEAR MOV #IT.CSR+6,R3 ; SET PTR TO SECTOR ADD. REG. IT.DTL: ADD #4000,R5 ; INCREMENT SEC. COUNT BY 1K MOV R5,@R3 ; WILL DISK RESPOND TO THIS ADD? MOV #1,@R4 ; NO-OP AND GO FUNCTION G SET ADDRESS OF WORD OF ZEROS. MOV #-64.*1024.,@#IT.WC ; SET 1K SECTOR WORD COUNT MOV R1,@#IT.DAR ; SET SECTOR ADDRESS. MOV #3,@R4 ;SET WRITE AND GO FUNCTIONS. A10: TSTB @R4 ; WAIT FOR DONE BIT. BPL A10 ; TST @R4 ; CHECK FOR ERRORS. BPL A20 ; NONE. MOV @R4,-(SP) ; PUT STATUS REG ON STACK FOR ERROR MOV #1426,-(SP) ; SI BIT #4000,@R4 ; IS IT THERE OR NON-EXISTANT? BEQ IT.DTL ; ITS THERE, KEEP LOOKING MOV R5,R3 ; ALL DONE. SAVE COUNT IN R3. MOV #400,@R4 ; CLEAR THE DISK ; ; CLEAR THE DISK TO ALL ZEROS. ; CLR R1 ; SET BLOCK COUNTER IT.CDF: MOV #400,@#IT.DER ; SET CMA INHIBIT TO DO ALL XFER FROM ; ONE WORD. MOV #ZERO,@#IT.CMA ; SET ADDRESS OF WORD OF ZEROS. MOV #-6KET UP AN F26 ERROR VIA DOS IOT ; GO DO ERROR NEVER RETURN. A20: ADD #1024.,R1 ; INCREMENT SECTOR COUNT. CMP R1,R5 ; DONE YET. BLO IT.CDF ; NOT YET. ; PREPARE SET UP PERMANENT BIT MAPS: CLR R4  ; CALCULATE NO. BM REQD INC R4  ; RESULT IN R4 SUB #960.,R5 BCC .-6 ADD #960.,R5 ; REMAINDER IN R5 ASR R5  ; REDUCE TO BM BYTES ASR R5 ASR R5 SUB R4,R3  ; START BM BLOCK MOV M4.*1024.,@#IT.WC ; SET 1K SECTOR WORD COUNT MOV R1,@#IT.DAR ; SET SECTOR ADDRESS. MOV #3,@R4 ;SET WRITE AND GO FUNCTIONS. A10: TSTB @R4 ; WAIT FOR DONE BIT. BPL A10 ; TST @R4 ; CHECK FOR ERRORS. BPL A20 ; NONE. MOV @R4,-(SP) ; PUT STATUS REG ON STACK FOR ERROR MOV #1426,-(SP) ; SET UP AN F26 ERROR VIA DOS IOT OR3,R0  ; AGAIN SAVE FOR LATER .PAGE ; DO ALL MAPS BUT LAST: MOV IT.OBF,R2 ;SET UP R2 WITH BUFFER ADDRESS MOV #3,8.(R2) ; SET BLOCKS 0 & 1 IN USE. CLR R1 ; CLEAR MAP # COUNTER IT.BMG: MOV R3,-(SP) ; SAVE BLOCK NO. FOR WRITE INC R3  ; STEP FOR LINK INC R1  ; SET MAP NO. MOV R3,(R2)+ ; STORE BOTH AT MAP START MOV R1,(R2)+ MOV #60.,(R2)+ ; FOLLOWED BY MAP SIZE MOV R0,@R2 ; ... & 1ST MAP NO. DEC Q ; GO DO ERROR NEVER RETURN. A20: ADD #1024.,R1 ; INCREMENT SECTOR COUNT. CMP R1,R5 ; DONE YET. BLO IT.CDF ; NOT YET. ; PREPARE SET UP PERMANENT BIT MAPS: CLR R4 ; CALCULATE NO. BM REQD INC R4 ; RESULT IN R4 SUB #960.,R5 BCC .-6 ADD #960.,R5 ; REMAINDER IN R5 ASR R5 ; REDUCE TO BM BYTES ASR R5 ASR R5 SUB R4,R3 ; START BM BLOCK MOV R3,R0 ; AGAIN SAVE FOR LATER .PAGE ; DO ALL MAPS BUT LAST: MOSR4  ; AT LAST MAP? BEQ IT.BMD JSR PC,IT.WRZ ; IF NOT WRITE OUT BR IT.BMG ; NOW DO LAST MAP: IT.BMD: CLR -6(R2)  ; SCRUB LAST LINK MOV #100000,R4 ; SET MASK ADD R5,R2  ; GET TRUE MAP END MOV R2,R1 ASR R5 SUB #60.,R5  ; ... & SET UNUSED WORD CNT MOV R3,-(SP) ; SET BLOCK POINTER IT.BML: DEC @SP  ; DROP IT BIS R4,@R1  ; MARK IT IN MAP ASR R4  ; ADJUST MASK BCC .+6  ; ACROSS WORDS IF NEC. ROR R4 TST -(R1) CMP @SP,R0  ; BAUV IT.OBF,R2 ;SET UP R2 WITH BUFFER ADDRESS MOV #3,8.(R2) ; SET BLOCKS 0 & 1 IN USE. CLR R1 ; CLEAR MAP # COUNTER IT.BMG: MOV R3,-(SP) ; SAVE BLOCK NO. FOR WRITE INC R3 ; STEP FOR LINK INC R1 ; SET MAP NO. MOV R3,(R2)+ ; STORE BOTH AT MAP START MOV R1,(R2)+ MOV #60.,(R2)+ ; FOLLOWED BY MAP SIZE MOV R0,@R2 ; ... & 1ST MAP NO. DEC R4 ; AT LAST MAP? BEQ IT.BMD JSR PC,IT.WRZ ; IF NOT WRITE OUT BR IT.BMG ; NOW DO LAST MAP: IT.BMD:WCK AT 1ST MAP BLOCK? BGE IT.BML  ; ALLOWING FOR MFD #2 CMP (R2)+,(SP)+ COM (R2)+  ; FILL UNUSED MAP SECTION INC R5 BNE .-4 JSR PC,IT.WRZ ; ... & WRITE OUT .PAGE ; BUILD MFD BLOCK #1: MOV R0,@R2  ; SET LINK TO MFD #2 DEC @R2 MOV (R2)+,-(SP) ; SAVE FOR LATER MOV #5,(R2)+ ; INTERLEAVE FACTOR MOV R0,(R2)+ ; SET 1ST MAP NO. MOV R0,(R2)+ ; FOLLOWED BY LIST INC R0 CMP R0,R3 BNE .-6 MOV #1,-(SP) JSR PC,IT.WRZ ; BUILD MFD BLY CLR -6(R2) ; SCRUB LAST LINK MOV #100000,R4 ; SET MASK ADD R5,R2 ; GET TRUE MAP END MOV R2,R1 ASR R5 SUB #60.,R5 ; ... & SET UNUSED WORD CNT MOV R3,-(SP) ; SET BLOCK POINTER IT.BML: DEC @SP ; DROP IT BIS R4,@R1 ; MARK IT IN MAP ASR R4 ; ADJUST MASK BCC 10$ ; ACROSS WORDS IF NEC. MOV #100000,R4 ; RESET MARKER BIT TST -(R1) 10$: ; CMP @SP,R0 ; BACK AT 1ST MAP BLOCK? BGE IT.BML ; ALLOWING FOR MFD #2 CMP (R2)+,(SP)+ C[OCK #2: CLR (R2)+  ; ZERO LINK MOV #401,(R2)+ ; MONITOR UIC = 1,1 CLR (R2)+ ; NO UFD ASSIGNED YET. MOV #9.,(R2)+ ; NO. OF ENTRIES/UFD CLR (R2)+ JSR PC,IT.WRZ ; WRITE OUT MOV #IT.OUL,-(SP) ; RELEASE THE OUTPUT DATASET EMT 7 EMT 60 .PAGE ; DATA AREAS: ; A) BUFFER SPACE: IT.OB1:    ; OUTPUT .=.+200 IT.OB2: .=.+200 ; ; B) LINK BLOCKS: IT.OUL: .WORD 0,0,1 .RAD50 /DK/ ; DEV]OM (R2)+ ; FILL UNUSED MAP SECTION INC R5 BNE .-4 JSR PC,IT.WRZ ; ... & WRITE OUT .PAGE ; BUILD MFD BLOCK #1: MOV R0,@R2 ; SET LINK TO MFD #2 DEC @R2 MOV (R2)+,-(SP) ; SAVE FOR LATER MOV #5,(R2)+ ; INTERLEAVE FACTOR MOV R0,(R2)+ ; SET 1ST MAP NO. MOV R0,(R2)+ ; FOLLOWED BY LIST INC R0 CMP R0,R3 BNE .-6 MOV #1,-(SP) JSR PC,IT.WRZ ; BUILD MFD BLOCK #2: CLR (R2)+ ; ZERO LINK MOV #401,(R2)+ ; MONITOR UIC = 1,1 CLR (R2)+ ; NO UFD ASSIGNED YEICE CODE ; D) OUTPUT TRAN BLOCK: IT.OUB: .WORD 0,0,64.,2,0 ; .END START ; THE END AND THE BEGINNING. aT. MOV #9.,(R2)+ ; NO. OF ENTRIES/UFD CLR (R2)+ JSR PC,IT.WRZ ; WRITE OUT MOV #IT.OUL,-(SP) ; RELEASE THE OUTPUT DATASET EMT 7 EMT 60 .PAGE ; DATA AREAS: ; A) BUFFER SPACE: IT.OB1: ; OUTPUT .=.+200 IT.OB2: .=.+200 ; ; B) LINK BLOCKS: IT.OUL: .WORD 0 .RAD50 /DV0/ .WORD 1 .RAD50 /DC/ ; D) OUTPUT TRAN BLOCK: IT.OUB: .WORD 0,0,64.,2,0 ; .END START ; THE END AND THE BEGINNING.