t¸t¸¼t¸‘Ú*t¸æª»ˆæ´»ˆæÒ»æ´»ˆæC!ˆæÿ¼÷ ÊÏ*˜¸÷q,÷è¼(÷ î÷ Ø÷0,÷&wþ.¼¸‚÷ ÂÀÞ»Åñÿ7Ð $… ù�ì7 ÷\¼Ú.*ä¸& Î�òæ[½æ"ˆ& Î�ãæW½æ"ˆ÷•,ú*¹S÷• I÷• B÷ ®÷X½ª÷ p7’*,¹÷ TÁ^¼ÄùÿÉ Áe„ ú�÷rð÷ý,P¹x÷Y½t÷ :æ€æ¾½æ"ˆ÷Z÷©½VŒ*v¹÷ «fæi½æ"ˆfæl½æ"ˆfæp½µ*š¹æ"ˆ÷•L¿É €÷•CµfÎEðæv½÷ ¤*¾¹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‚÷ ÂÀjÅñÿ7 æ"ˆf拽æ"ˆ÷• ¯wbwb†*â¹þf攽ƒæ"ˆ×¢0Ó• úf朽æ<*º"ˆ÷• Œf梽æ"ˆ÷• ‚÷• {÷•Æ**º t÷H–÷a½’÷ X€÷ „÷ý€÷ 1*NºFæŽæ¾½æ"ˆ÷f÷©½b÷ ( æ@*rºC!ˆæà½÷ ä÷\8H÷TZ· 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÷ ®÷äª÷ p7’U äî,¸÷ TÁêÄùÿÉ Áe„ ú�÷rð÷R  êù.Üx÷åt÷ :æ€æJæ"ˆ÷Z÷5V9åJ&50,÷ «fæõæ"ˆfæøæ"ˆfæücõø&ü£,&æ"ˆ÷•L¿É €÷•CµfÎEðæ÷ ¤d ,»¸Îí²æë½æ"ˆ÷• ©÷• ¢÷• ›÷•*P» |÷• w÷• n÷Gd÷̽`÷ &æ´»Å,t»ˆæ´»ˆæª»ˆ0ˆæ¼»æª»ˆæª»ˆ‡æÆ»,𻿴»ˆæ´»ˆ‡÷ð�M€MÜ»´"À»@€‘Ú 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 ,nþfæ ƒæ"ˆ×¢0Ó• úfæ(æ» $(k,’"ˆ÷• Œfæ.æ"ˆ÷• ‚÷• {÷• .«,¶ t÷H–÷í’÷ X€÷ „÷O€÷ ²í"Ot,ÚFæŽæJæ"ˆ÷f÷5b÷ ( æÀ J5:,þC!ˆæl÷ ä÷\8H÷TZ· V÷ ðÀð  lu,"&7BÐ Ð Ã ˆ½ Q ‘½ H ™½ @ ¢½ 7¨½ TOTAL BLOCKS e#ý ******* DISK MAP þé½ =ð½ BLOCKS USED ®¾ BLOCKS FREE ò ¾ À*b¾·|·~÷#¿v÷öÿt·f·df&æA,†¾æZæ*¿æ"ˆ÷e�æ,¿æ"ˆ…Ö Äì¾(*¬¾&æ&¿æ"ˆfæ ¿æ"ˆåòÄÅÚ*о· €•ûƒ„…Ƕ>J&*ô¾zQÒ�QÖAÔA� ˜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îÐ ìÅ5ÿ÷ì÷ZèÀ *Zg,p÷ ®fæžæ"ˆ÷RÐ÷œÌ÷ ’Åe@N žœ,”Å-ÚÄ寴æÊæ‹æ"ˆ÷• Õæ± ‹H,¸¸Îí²æwæ"ˆ÷• ©÷• ¢÷• ›÷•T  wh,Ü |÷• w÷• n÷Gd÷X`÷ &æ@EX&@ .ˆæ@ˆæ6ˆ0ˆæHæ6ˆæ6ˆ‡æRNÕ¿Ë‘ T%¿ ô)¿ ð/¿ ýt¸ÍV #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».&æ@ˆæ@ˆ‡÷ð�M€Mh_@ @(h»$L@€‘Ú N›5 èþ 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 .¶ . ^ 4°4 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  ¤@ ¤ è îö,î·|·~÷¯v÷öÿt·f·df&æ– ¯-.æZæ¶æ"ˆ÷e�æ¸æ"ˆ…Ö ÄxÕ ¶¸(x¢,8&æ²æ"ˆfæ¬æ"ˆåòÄÅ[²¬e,\· €•ûƒ„…Ƕ>J&),€zQÒ�QÖAÔA� ˜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 o ; 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 """"€ˆˆˆˆ€ˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€€ˆˆˆˆˆˆˆˆˆ @"ADD€€B C‘Ú¡K’›‘ÚQŽ’H)›‘ÚRŽ’H*›‘Ú^’ $›¸OŽ’k›¸PŽ ('›¸^ tt›£„:OŽ’4 p›£„:PŽ x0›£„:QŽ1 +_›8}OŽ’{ ››8}^’|€›8}¡K’„„›8}OŽ’ˆ ›8}^’Ÿ£›8}¡K’¤¤›#Y`OŽ’§ç›#Y`PŽ’¨ä›#Y`^’èü›#Y`¡K’ë󛸡K --›£„:^1 .2›£„:¡K1 15›$Dÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ˆˆˆˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅaå Í‹æÄ,L ƒw:ÄB8ŽŒ ýƒàÇ` 5 þÿ€�&ˆ ‚— ýÿ†ƒœÃEÀÿ× >w†× × ò f€ò5ÀeòU@ò €× [æ*ˆ² ¦¦æ× Ž & *ˆÖ G× ‚&(ˆ°Ì 8�L'ˆ°4e÷ ÌQ$ ô �BBâBä" ± üÿü× ÷ ¬ŒÉU@Ò °ðU€ Æe  Å"U%÷‹äþGæÎeÞþæfÇ.Ö … U¥… … … … U¥Ñ Bb‘â‹Ã 0Š æ*ˆ€�Ö BÃÅ.&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 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 ; 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 w ; 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 .¸¯”(–¸h¯”F÷æ.€P ¸÷VÃÃeæÿÄœÄ`Y.&Xß Zß“ÁêÁÊÿQ$ÀÈê```BÂEùÿÂUA›.L ‡æ$^ ÁÀêÀ¢ÿB� Â5× ‡4,r÷ ¸ÿæ&^ ðU€ ß Âêì7 rÿfæ…ó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 ÷ DKDR ; DKDR MFDBLK =1 ; DISK ADDRESS OF MFD BLOCK #1. DKDR ; DKDR .PAGE DKDR .GLOBL DK ; DKDR ; STANDARD DRIVER TABLE DKDR DK: .WORD 0 ; 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}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月  7ЉÁ5·Šæ’ˆ ·€æ¤œ’*¤Æ,(撈撈7væ®æœˆæœˆÀe€#’ ’®œ œ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 PLATTELÂe À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~æˆ  7ЉÁ5·Šæˆ ·€æ±*ž~æˆæˆ7væ$æˆæˆÀe€k*Â~Â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 #3�TCH 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,R—K 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 CONTROL˜P) 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}¯”(–@(~÷æ0æxˆ  7ŠeÁ5·Š[ænˆ 7fæŠÃxn*Š(,(æxˆæxˆ·Hæ€ænˆænˆÀe€�x x€n n.,LÂe À5ÿåænˆ� Á5Óæxˆ0ˆ92. .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}é.š~æˆ  7ŠeÁ5·Š[æˆ 7fæ$e*Â~æˆæˆ·HææˆæˆÀe€ÿ*æ~Âe À5ÿåæˆ� Á5Óæˆ0ˆ * 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) ;WHOªOSE 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 4°HBLK  ;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-BUFF´ORD 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,-(SP¼SR 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,LNK1U½ORD 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 ÿMOVÈAKE 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 ÿ ÿ;REÐOPY 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,-(SPØT 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ì& ±Œ:¯”(ôƒ(x€9÷æûÿûÿPœ @• @ž €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{,*R»EE*v»  N;�*š»@N; P{ æT»ˆæl»è*¾»ˆæ^¾æT»ˆæ|¾æT»ˆæT»ˆæH;æl»',⻈æl»ˆ÷  í7�•ÿ放æT»ˆæT»ˆæH;$,¼æl»ˆæl»ˆ÷ ví7 kÿ÷ €ç7�iÿæ¿©*.¼æT»ˆæT»ˆæH;æl»ˆæl»ˆ7 î~÷¥YK*R¼ú~· â~æl»ˆæ„»ˆæŽ»ˆ7 &ÿ7 ,ÿ7 Ì*v¼2ÿ÷@ÿð &¸,^€@ @ 怈æ0€6 @ €&0€Ë,‚€ˆæ"ƒæ€ˆæ@ƒæ€ˆæ€ˆæ æ0€Ú""ƒ €@ƒ€€" &0€F.¦€ˆæ0€ˆ÷  í7�•ÿæXƒæ€ˆæ€ˆæ é0€Xƒ€"€( �.Ì€æ0€ˆæ0€ˆ÷ ví7 kÿ÷ €ç7�iÿæÖƒ‚0€ 0€(Öƒó,ò€æ€ˆæ€ˆæ æ0€ˆæ0€ˆ7 î~÷¥Y€ € 0€0€ê,�ú~· â~æ0€ˆæH€ˆæR€ˆ7 &ÿ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� ¨*š¼Îe‡æ¨¾æT»ˆæT»ˆ‡÷œ»‚~÷5.¾¼Úþ斻愻ˆæ„»ˆ7 n~w :í÷ºþæ–»º*æ¼æŽ»ˆæŽ»ˆ· N~w ð÷ <~wž7 <~©* ½÷ˆþ�þ÷‚þ”þ÷¦»"~×-vþ?÷zþ÷[,.½~þ栻愻ˆæ„»ˆ7 ~w Ìó÷°»î}檻H*T½æŽ»ˆæŽ»ˆ· à}w ¬óÀN;ÁP{Âà$ú*x½wÈ‚ ú÷ À}· º}÷e þ÷e þ×-þi*œ½BwŒÿ÷e@ìý×-èýB ÷ûÿŠ}×-Úý?*,À½÷Ôýwìþæø¾æT»ˆ7 Èý÷Æý栻愻k.ô0€H€R€`,:�2ÿ÷@ÿ÷ ÿ÷ $ÿw(À�¼~Àå0� ,^�Îe‡ælƒæ€ˆæ€ˆ‡÷`€‚~÷ƒlƒ€€"`€‚0‚�ÚþæZ€æH€ˆæH€ˆ7 n~w :í÷ºþæZ€ Z€H€H€*Z€G,ª�æR€ˆæR€ˆ· N~w ð÷ <~wž7 <~ R€ R€5,Î�÷ˆþ�þ÷‚þ”þ÷j€"~×-vþ?÷zþ÷E j€ô.ò�~þæd€æH€ˆæH€ˆ7 ~w Ìó÷t€î}æn€d€õ ;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 JU潈栻掻ˆæŽ»ˆæ„»ˆæŽ»ˆæT»ˆæT»n*¾ˆw ýÿ &}€· "}…÷e0}÷�}¢æ´¾â,2¾æT»ˆw˜ÿ÷ûÿþ|Õ …· ø|wfþæÒ¾æT»²*X¾ˆwvÿ DECTAPE COPY V01B e*|¾ORIGINAL ON UNIT COPY T/* ¾O UNIT ????  *** I/O Ð*ľERROR, UNIT  *** UNRECOVERADè¾BLE COPY ERROR aø¾ COPY COMPLETED ç#¿VERIFY COPY (Y OR N)? a´»Šø H€H€"t€(n€,‚æR€ˆæR€ˆ· à}w ¬óÀÁ@Âà$HR€ R€ @‰,<‚wÈ‚ ú÷ À}· º}÷e þ÷e þ×-þÛ,`‚BwŒÿ÷e@ìý×-èýB ÷ûÿŠ}×-Úý?œ.„‚÷Ôýwìþ漃怈7 Èý÷Æýæd€æH€¹¼ƒ€$d€(H€î0ª‚ˆæd€æR€ˆæR€ˆæH€ˆæR€ˆæ€ˆæ€!"d€ R€R€H€R€$€*€Ö,Ò‚ˆ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 û; 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üwfþ斃怊€$–ƒ(€K,ƒˆwvÿ DECTAPE COPY V01B ×,@ƒORIGINAL ON UNIT COPY T¡,dƒO UNIT ????  *** I/O B,ˆƒERROR, UNIT  *** UNRECOVERA¶¬ƒBLE 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,ÿ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 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 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 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  ;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  .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 ATO 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 --  ;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 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 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)+,  ;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  ; 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@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  ;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 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  = 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? MOV .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  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  #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 ; ;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  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 ;  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) ; S .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/  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. ET 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 ! ;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# 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 $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 MOV R0,@R2 ; ... & 1ST MAP NO. DEC %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 ' ; 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. SIN(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 .+6  ; ACROSS WORDS IF NEC. ROR R4 TST -(R1) CMP @SP,R0  ; BA) ;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 CE DKDR .END ; FATAL WILL NEVER RETURN. DKDR ,CK 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 BL/; 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 '0OCK #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–¸r,€P ¸÷VÃÃeæÿÄœÄ`^,&Xß Zß“ÁêÁÊÿQ$ÀÈê```BÂEùÿÂUA ,L ‡æ$^ ÁÀêÀ¢ÿB� Â5× ‡9*r÷ ¸ÿæ&^ ðU€ ß Âêì7 rÿfæŠø2&£„:¯”(j(Nô÷æ.æXˆ·T·Ræ`æXˆŽ‡Â0¦iX`Xš.&÷ ÖÿÂe€— ØÂX·Âe€" · üއ¬ØX—.L×XæXˆ ÄÀêÌÃÆêÅeKÌîXX".rÌ5øCÌ ßÈêßLÄêßÂê_ÆêÌâ LŠ.˜Ì‹þ€Ì €&æÁeE ç‡ „ ÅåÀü†Åe.¾À… … … áÀ„ÿò æƒ � ÒRÒ<ò3DK'. ; ; ;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 THEREFORICE CODE ; D) OUTPUT TRAN BLOCK: IT.OUB: .WORD 0,0,64.,2,0 ; .END START ; THE END AND THE BEGINNING. 5ÆlÆljm£„:,Èlæ oˆ·T·Ræ(oæ oˆŽ‡Â0¦›,îl÷ ÖÿÂe€—  n n·Âe€" · üއ,m× næ oˆ ÄÀêÌÃÆêÅeKÌT,:mÌ5øCÌ ßÈêßmÄêßÂê_ÆêÌ},`mÌ‹þ€Ì €&æÁeE ç‡ „ ÅåÀü†ÅeÐ,†mÀ… … … áÀ„ÿò æƒ � ÒRÒ<Â,¬m Ä ÷ 0ÿó2 úÿÄ€Ba�… Åå<æÎ Q„ ¸,Òm†Ä€á €#÷–$R … ý÷ üþ Ê ¦Ò²,øm€  üæ÷ àþ Ò Ò  ÷ Îþæ o.ä Ä ÷ 0ÿó2 úÿÄ€Ba�… Åå<æÎ Q„ è. †Ä€á €#÷–$R … ý÷ üþ Ê ¦Òá.0€  üæ÷ àþ Ò Ò  ÷ ÎþæXˆ; &Xp V0ˆã X�X¸@só7E 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 ; ˆ×n0ˆ³ o¸@Cmv;; 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 =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 ; ?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 = 1A; 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 C65302 ; 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 ; WECMP 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 = 1GILL 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 ; ONEI65302 ; 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 ; WK 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 EMILL 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 ; ONEORROR 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 Q 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 ES 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 URROR 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 WMOV 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 Y 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 [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. ]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 .+6  ; ACROSS WORDS IF NEC. _ 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:   a MOV #100000,R4 ; RESET MARKER BIT TST -(R1) 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. MOV R0,(R2)+ ; FOLLOWED BY LIST IN ; 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. eC 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:    ; 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.