;TIMDGN.S07 ;27-JAN-72 ;TIMDGN.S04 ; ************* T I M D G N . P A L ************************** ; 26-JAN-72 ; 20-JAN-72 ; TIMER MODULE DIAGNOSTIC ROUTINE - TEST #1 OF 4 ; THIS ROUTINE SETS UP THE INTERRUPT VECTORS, ; CLEARS CORE UP TO THE LOADERS, SETS CPU LEVEL TO 7, ; ENABLES THE MODULE INTERRUPTS, AND DELAYS FOR ; FIVE SECONDS. THEN IT DROPS THE CPU PRIORITY BY ONE ; LEVEL, AND COUNTS THE INTERRUPTS AND THE ORDER ; IN WHICH THEY COME IN. IF THE INTERRUPTS¿0¿ ±Œ:�*Æ  Ñ P Ð À‹úÀtÁàÂ�œê*$P  ú÷<Òã È Àe ü÷Âã–%ÀåÀ’*H  bü‚Ã:÷5ãwnÆ7 X7 *lV7 XÀãÀEãÿ7 Ä‚ E Ä ü™*�BÁEÿwð÷5 ØâwXã  wNã ÷a*´Þ7 Ü7 ÔÅÌ÷ Üßå þÿÂ-¼Ú*ØÀºK÷ŽâÅd÷ ´ß xÿ·�Àÿÿ*ü³· ÀÄU · ºÄU· ´ÄU÷5Xâ¬* 7AtËp—!üÀ ÷ XÀ€’*DÀe ÀEÿ7 ;18-MAY-72 ;24-NOV-71 ; MAG TAPE DIAGNOSTIC EXERCISER R0 = %0 ;REGISTER DEFS R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 ;STACK POINTER PC = %7 ;PROGRAM COUNTER PS = 177776 ;CPU STATUS SWR = 177570 ;CONSOLE SWITCHES TKS = 177560 ;TTY KB STATUS TKB = 177562 ;TTY KB BUFFER TKI = 60 ;TTY KB VECTOR TPS = 177564 ;TTY STATU¿0¿ ±Œ:�*Æ  Ñ P Ð À‹úߢDßÀFß(*$0߀2ß@pÿÆß`þÿ÷ :7ŠÊ7ŠF*HÉ7ŠÆÄ7м÷ ÂÄ*÷ º÷ òÄ¥ ½*l7‘¢øÁ ÷‹˜Ä?èñ­Œ–Á úö=*�Á G¢LRFNCDAMSPEXXx†”´öºþÈ»*´ÂJ:ÁxÿÁEÿÍwB7ŠM÷:,·Š)÷ Z*Ø÷,· ß xÿ€÷Š+÷µ%· ÷ 6!*üæÁxÿÁEÿÍÂêÂE2BP·è÷ w x, * ß5xÿƒwœ DONE ÷�Èà÷ ÷5¸Ž*D÷÷° FAIL TO ; COME IN IN THE PROPER ORDER, OR FAIL TO COME IN ; AT ALL, THE TEST WILL HALT WITH THE ERROR NUMBER ; DISPLAYED IN THE "DATA" LIGHTS. ; ; R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 PS = 177776 SWR = 177570 ; ; ; INIT ALL VECTORS BELOW 400 WITH "HALTS" ; .ASECT .=16000 TIMA00: MOV #.,SP  ;INIT STACK CLR R0 CLR R1 TIMA10: TST (R1)+ MOV R1,(R0)+ CLR (R1)+ TST (R0)+ TSTB R0 BNE TIMA10 M 8À· 6÷ 4÷]00¬*h7!,À ß5@xÿwÖþ¨*ŒÐî'þwêÿÅÊÅ þâ*°÷ Þÿù‡:."ÀºÿÂV*Ô�¸P  ú÷@XâwVâ÷Úÿ÷ÈÿÈÿa*ø7 Æÿ7 Äÿ7 Âÿ7 Àÿ7 ¾ÿÀháÀEãÿ7êÏ÷@]*Háþ· œÿ· ˜ÿ· ”ÿ· �ÿ· ŒÿÀ(@÷ ˆÿ ÷€ÿ÷ pÿ7 ¬Ï÷áÆ-ø S TPB = 177566 ;TTY BUFFER MTN = 167540 ;MAG TAPE WORD COUNT MTS = 167542 ;MAG TAPE STATUS MTC = 167544 ;MAG TAPE COMMAND MTA = 167546 ;MAG TAPE ADDRESS MTI = 104 ;MAG TAPE VECTOR BELL = 7 CR = 15 SPCE = 40 WRITBF = 1000 ;WRITE BUFFER BUFLTH = 5000 ;BYTE LENGTH OF EACH BUFFER READBF = WRITBF+BUFLTH ;READ BUFFER .ASECT .PAGE ¼w ¦ü ÷5˜$ß57*hxÿ Á˜ÂŽÅ’Å �R$ü÷ öDÄí~ó*Œä ÷ Dþÿ÷ „þÿ÷ ë÷ "÷ P‡÷5*°H÷5Ë@÷ LÇ÷5 2ß5@xÿ Ï*ÔÀ$ÀEÿÍÀU7w ø÷5; ÷Š Ê*ø©‡ AÁEÿÏw ì\7Šßâdï÷  ß5º*@bïoß5€bïjý5ß5bïaß@pÿ–*@ý5 ý5À°  þüƒ_fï_"*d`ï@ÂÂEýÿ·�› bïdï÷ 6ý5~*ˆß5bï÷‹{ù÷‹s¶÷bï`÷=PZO*¬&…ß5@bïüðÀÀ þ OV VECTOR,R0 MOV #340,R1 MOV #6,R2 TIMA20: MOV INTADS(R2),(R0)+ ;INIT PC VECTOR MOV R1,(R0)+  ;INIT PS DEC R2 DEC R2 BNE TIMA20   ;LAST TABLE LOC = 0 ; ; MOV #TIMB20,4  ;FIND HOW MUCH CORE CLR R0 TIMB10: TST (R0)  ;WILL TRAP ON NO CORE ADD #20000,R0 ;NEXT BAY BR TIMB10 TIMB20: MOV #6,4   ;TRAP HERE:RESET VECTOR CMP (SP)+,(SP)+  ;RESET STACK SUB #300,R0   ;BACK OFF BELOW LOADERS TIMB30: CLR -(R0)   ;CLEA .=14000 MTEXER: ;BEGIN OF EXERCISER MOV #.,SP ;SET STACK POINTER CLR R0 ;PREPARE FOR SETTING VECTORS CLR R1 INITV: TST (R1)+ ;BUMP TO POINT TO STATUS WORD MOV R1,(R0)+ ;ALL VECTORS POINT TO .+2 CLR (R1)+ ;PUT HALT IN VECTOR+2 TST (R0)+ ;KEEP UP WITH R1 TSTB R0 ;LOW BYTE WILL CLEAR AT 400 BNE INITV MOV #MINT,@#MTI ;INIT MA‡ß5@bï·ŠAP*Ð@ÀEÿÍÁEÿÏwÄp*ôƒ ƒ ƒ ƒ ƒ Ãe0÷ wþ÷ hw |½*$Ä÷ ú‡ERR ÷ žw dFw ’÷‹€*<ûÿwêü‡ ?:Ĭ÷ Öÿ7¤ùĦ÷ ÈÿD*`7žÃe÷œÄe 7ŽðÄ„÷ ¨ÿ7|¸*„ùÄ�t÷ šÿ7‘lùÄt÷ Œÿ7lù÷‹m*¨w€ü7ŠaÄ<÷ lÿ74ùÂèÂÜI*Ì„Z÷ ô÷ "ødïbï`ïfïô è*ðþúÄ• ÷ Ä=÷ ÷ NÁ€Ä%Wå*Ä%Bíw@Zw@šw@lwPLwPŒR ALL CORE CMP R0,#PGMEND  ;...DOWN TO THIS PGM BHI TIMB30 ;------------------------- MOV ENBAD,R3 BIT #4000,SWR ;RUN CALIBRATE? BEQ TIMC05 JMP CALIBRATE TIMC05: MOV #TIMA00,SP TIMC10: RESET   ;CLEAR EVERYTHING, INCLUDING STALL CLR CONTA1 CLR CONTA2 CLR COUNTC MOV SWR,R0 MOV R0,R1 BIC #-34-1,R0 MOV R0,R2 MOV R0,ENBPAT ; ;VERSION 001 ; REVISION 004 ; DATE: 24-APR-72 ;THIS IS THE LINE PRINTER DIAGNOSTIC ROUTINE ;SEE THE WRITEUP OF THE ROUTINE FOR OPERATING INSTRUCTIONS R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 PS = 177776 SWR = 177570 ;CONSOLE SWITCH REGISTER SCOPE = EMT  ;USED AS CALL TO ERROR ROUTINE ;THE FOLLOWING ARE REGISTER ADDRESSG TAPE INTERRUPT MOV #300,@#MTI+2;INIT VECTOR STATUS:LVL #6 MOV #TTYINT,@#TKI ;INIT TTY KBD INTERRUPT MOV #200,@#TKI+2;TTY LEVEL #4 .PAGE HALT: RESET ;FORCES STOP OF TAPE ON DEMAND ; ; DIALOG = . ;BEGIN OF DIALOGUE WITH OPERATOR MOV #100,@#TKS;ENABLE TTY KBD INTERRUPT MOV #MTEXER,SP;RESET STACK POINTER MOV #140,@#PS ;RELEASE LOCKOUT JSR PC,CRLF ;BEGIN OF DIALOG W/OPR CLRB CHRFG wP^7Š©*8ß ÷ Ä¥:Ä¥ Ä¥ Ñw r÷‹g*\ûÿ&Ó ÷·Š¯ç÷‹© Äà Ôƒ !È*€ û‡w¦ûà ÁÅþ D÷ 0÷ ^E ùƒðD*¤�Eã à ó�û· Åå Å üT! Þ†e*È÷&æÀ à D  à D à D à D Äe*ì0÷ *À 󃀇·Š×­Ä ÷ ÷*÷ ‡÷ b‡ß‹tÿý€‘vÿ‡÷—rÿè÷Å€â"*4÷¥HÜß5xÿ wäú÷‹É7ŠÃ·Šº`*X·Š¹÷‹°ý7ŠªÄ�¬! ÷ ‡÷ ¢ÿ‡·*|&Ä ÷ –ÿÄ÷ �ÿ7Š„„‡@fA”÷ |ÿ CLR R5 MOV #5,R4 TIMC11: ASR R2 ADC R5 DEC R4 BNE TIMC11 MOV R5,R2 BIC #-340-1,R1 MOV R1,LEVEL BIT #20000,SWR BNE TIMC12 MOV R1,PS MOV R0,(R3) BR TIMC13 TIMC12: MOV R0,(R3) MOV R1,PS TIMC13: CLR R4 MOV #2,BITFLG CLR INTFLG CLR INTCNT MOV MSECS,R5 ;ES FOR THE LINE PRINTER CONTROLLER R.AD = 165010 ;MEMORY ADDRESS R.LF = 165012 ;LINE-FEED CONTROL R.WC = 165014 ;WORD COUNT (2'S COMPLEMENT) R.CM = 165016 ;COMMAND (OUTPUT ONLY) R.ST = 165016 ;STATUS (INPUT ONLY) ; FIRST PUT HALTS IN ALL INTERRUPT LOCATIONS LP.DGN: MOV #.,SP ;INIT STACK CLR R0 ;POINTER TO VECTOR CLR R1 ;POINTER TO VE CLRB MINTFG ;INIT TAPE INTERRUPT FLAG CLRB PPOS ;INIT FORMAT FLAG MOV #BELL,R4 INAGN1:CLRB MCODE ;INIT MNEMONIC SAVE LOC JSR PC,OCH MOV #'*,R4 JSR PC,OCH ;PRINT "*":REQUEST INPUT INAGN2:JSR PC,ICH ;GET MNEMONIC CHAR CMPB #CR,R4 ;RETURN? BEQ DOACT ;YES:GO DO FUNCTION MOVB R4,MCODE ;SAVE CHAR BR INAGN2 DOACT: MOV #LSIZE-1,R1 ;INIT INDEX TSTB MCODE “* Á û�…@fA• Š÷ ¤ÿ¡��ŠA£ø‘öx*Ä… �… æ ÷ „ÿ¡ û¡-¡ ¡8*è/¡0!¡7à à ‡Ã ‡ÄÅøaµŠÿÿ—* áõ•ÿÿþÿÝW­ÿÿ Äõ‹þÿ ƒ…õ•?*0þÿú5Šþÿ÷÷ >ÿÀÈ÷ ÷ ²þÀ¶÷ w+*TØùÁ²Á  ”æÄ Ž E Ä üÃŠÖ … 6*x… C‹Ã÷ X ƒÃŒBŒD Ã<÷ BŠŠ*œaÂÁ ÝÃë÷ .Å ÄëÔ•0Å ü‚Œ_*Àd‹ÂÅ‚Œd‹Å üw Àþä‡Å…@Â@BQ‡ *äCRCC =  +DELAY FOR "MSECS" MILLISECONDS JSR PC,DELAY ;///////////////////////////////////////////////////////////////////// SUB #40,@#PS  ;DROP CPU STATUS TO LET ;     INTERRUPTS COME IN. ;///////////////////////////////////////////////////////////////////// BR .+2 BR .+2 BR .+2 CMP INTCNT,R2 BEQ TIMC20   ;YES MOV INTFLG,R0 BR SCOPE   ;TOO FEW OR TOO MANY TIMC20: RESET MOV #7,177566 MOV #100.,R5 JSR CTOR+2 LPDA10: TST (R1)+ ;BUMP TO VECTOR+2 MOV R1,(R0)+ ;PUT #VECTOR+2 IN VECTROR CLR (R1)+ ;PUT A HALT IN VECTOR+2 TST (R0)+ ;KEEP UP WITH R1 TSTB R0 ;AT 400 YET? BNE LPDA10 ;LO BYTE CLEARS FIRST AT 400 ;------------------------------- MOV #LPDI10,200 ;INIT INTERRUPT TO ERROR LOC'N MOV #340,202 ;INTERRUPT STATUS MOV #SCOPEI,30  ;WAS CR FIRST CHAR? BNE DCMP ;NO ILEGAL:MOV #'?,R4 ;ILLEGAL CHAR BR INAGN1 ;GO BACK AND TRY AGAIN DCMP: CMPB MCODE,MNETAB(R1);IS THIS CHAR IN TABLE? BEQ FOUND ;YES: GO TO RTNE DEC R1 ;MORE? BGE DCMP ;KEEP LOOKING BR ILEGAL ;CHAR NOT IN TABLE FOUND: ASL R1 ;*2 TO INDEX WORDS MOV RTNETB(R1),PC;GO TO PROPER ROUTINE MNETAB: .ASCII "LRFNCDAMSPEX" ;LIST OF MNEMONICS¾øPC,DELAY TST @#SWR BMI TIMC10   ;DO IT AGAIN MOV #177777,R0 HALT    ;SUCCESSFUL FINISH BR TIMC10   ;AFTER "CONTINUE" SWITCH ;--------------------------------------------------------------------- INTA: INC CONTA1 BIS #4,R4 BR INTSVC INTB: INC CONTB1 BIS #10,R4 BR INTSVC INTC: INC COUNTC BIS #20,R4 INTSVC: BIT #10000,SWR BEQ INTS ;INIT EMT VECTOR ; SET UP TO READ IN THE FIVE OPTIONS MOV #BYTLST,R0 ;TOP OF BYTE LIST MOV #5,R1 ;FIVE OPTIONS STOP00: HALT ;STOP HERE FOR FIRST PARAMETER LPDA15: BITB #177,@#SWR+1 ;IS BYPASS OPTION ELECTED? BNE LPDB10 ;YES: SKIP ALL INPUTTING TST @#SWR ;IS BIT #15 SET? BMI LPDA20 ;SWITCH SET TO BYPASS THIS ONE ONLY MOVB @#SWR,(R0) ;LOAD PARAM ENDTAB:.EVEN LSIZE = ENDTAB-MNETAB ;SIZE OF MNEMONIC TABLE RTNETB:.WORD LOC,RECNT,FILECT,WORDCT,COMMND,DATAIN .WORD AUTO,MANUAL,STATUS,PARAMS,ERRSET .WORD CRCPRT .PAGE AUTO: MOV @#SWR,R1 ;AUTOMATIC WRITE AND READ CHECK BIC #146777,R1;GET UNIT # & INT. ABLE BITS MOV R1,UNITNO ;SAVE IT CLRB WRTCTR ;INIT COUNTER REWIND:MOV UNITNO,EXCOM INCB EXCOM+1 ;FORM REWIND COMMAND JSR PC,EXEC ;DO IT !V1 BIC R4,ENBPAT MOV ENBPAT,(R3) INTSV1: CMP SP,#TIMA00-4 ;CHECK FOR PROPER PUSH BEQ INTS10   ;O.K. MOV #400,R0 BR SCOPE   ;STACK INCORRECT INTS10: TST DLYCTR BEQ INTS20   ;DELAY HAS COMPLETED MOV #1000,R0 BR SCOPE INTS20: MOV 2(SP),R0 ;CHECK LEVEL OF CPU @ TIME OF INT ADD #40,R0 BIC #177437,R0 CMP R0,LEVEL BEQ INTS30 MOV #1400,R0 BR SCOPE INTS30: "ETER (LOW BYTE) LPDA20: TSTB (R0)+ ;BUMP HERE IN CASE OF BYPASS STOP01: HALT ;WAIT FOR OPERATOR TO SET UP SWITCHES DEC R1 ;ANY MORE? BGT LPDA15 ;YES LPDB10: JSR PC,LPD.ST ;CHECK STATUS ERR010: SCOPE ;ERROR RETURN:BAD STATUS BIT #4,@#R.ST ;IS READY SET? BNE .+4 ;YES ERR020: SCOPE ;READY NOT SET MOVB #40,SCHAR ;INIT S# MOV UNITNO,EXCOM INC EXCOM ;FORM READ COMMAND TST @#SWR ;IS READ-ONLY BIT SET? BPL EXECAL ;YES DECB WRTCTR ;NO BITB #1,WRTCTR ;IS THIS A WRITE CYCLE BEQ EXECAL ;NO INC EXCOM ;SET TO WRITE EXECAL:JSR PC,EXEC ;GO READ OR WRITE BR REWIND ;NOW REWIND .PAGE MANUAL:MOV @#SWR,R1 ;DO ONE COMMAND SEQUENCE BIC #146777,R1;GET UNIT # & INT. ABLE BITS MOV COMAND$` ±Œ:Ã,Æ  Ñ P Ð À‹ú÷äfæ÷àbæ÷"òå‰*&À>Áßµyÿ ß xÿ�È—xÿЋÁ ó*J÷ lˆß5êˆ÷• ç÷•Bâ÷�ÖØN*n÷•6Ð÷ ¤÷xÿàÀÎÁ�¹÷м÷•BË*’´Á�°÷5À � à È�–2Â�“ÂÕ@÷5°*¶¤÷Š„÷Š€$÷�vx÷Åàoë÷‹fŸ*ÚÂBÃ�^ÂàÂEÀÿ¦÷ æ·•X êßJêßÿ*þÿÿ êßêß êýê _ êÀB êÀ]*"ÀEÿ?ÀUê÷æLå÷ ä÷Áê�A û*FÁ5@ˆA % INC INTCNT ASL BITFLG BIS BITFLG,INTFLG CMP R4,INTFLG BEQ INTS40 MOV #2000,R0 BR SCOPE INTS40: RTI  ;RETURN AND IMMEDIATELY PROCESS ANOTHER INT ;   ...UNLESS THIS IS LAST ONE, IN WHICH CASE ;   ...MAIN PROGRAM WILL MAKE FINAL CHECKS. ;---------------------------------------------------------------- SCOPE: CLR (R3) ;DISABLE ALL INTS BIT #40000,@#SWR BNE C05JMP HALT &YNTHETIC CHAR MOVB #66.,WDCNT ;INIT PAGING PARAMETERS MOVB PAGE,LINENO BNE LPDB15 ;INIT PAGE SIZE IF SPECIFIED... MOVB #66,LINENO ;...ELSE SET FOR FULL PAGE LPDB15: JSR PC,LPDC  ;BUILD FIRST BUFFER ; ; NOW WE ARE READY TO COMMAND PRINT OF THE LINE ; ; THIS IS ENTRY POINT TO PRINT ANOTHER LINE ; ; NOW COMPUTE WORD- AND LINE-COUNTS LPDD: MOV @#SWR,CONSOL MOV CURBUF,R0 ;BUFFER S',R2 ;GET COMMAND BITS BIC #31000,R2 ;MASK OUT UNIT & INT ENABLE BITS BIS R1,R2 ;PUT IN UNIT # MOV R2,EXCOM ;LOAD EXEC COMMAND WORD JSR PC,EXEC ;EXECUTE COMMAND JSR R5,ONCH ;GOOD EXIT: PRINT "DONE" ;NO RETURN IF ERROR .WORD DONE .WORD 6 DMPSTA:BIT #1,@#SWR ;TEST STATUS DUMP OPTION BEQ DIALOG ;NOT SELECTED JMP STATUS ;GO DUMP STATUS FIRST ; DONE: .ASCII / (Á5ˆ÷ úð êˆÁ5@à*jˆ÷‹î€Ãâà þ êˆ÷ 6ˆ÷5Ò½*ŽÀÊ@ @ ÀmÀ&@ @ Àm¶@ @ 7®ÖEþ˜*²æ ÷ L÷‹† wŠ€ wŠzæ�vÎEÿ÷ 0wô*Ö þwŠfÀÿÿøˆ÷ä”ä þÿ–%—!ˆÈ*úÁ`ÂêÁµÀˆ�ˆÂ5@¶ˆ÷26ßâ*àþÿ÷e†*÷-& ó‚÷÷åƒÁÀ�Â*BÀE€ÿ À�ù·Šõ×­ñ`÷• ç÷•ÝU*f&÷ h€�ÀÅ€÷5 ä÷5Ü€  `u*ŠÀ w ¾èƒ¦6 ÷Š¡ð÷•™Àe÷*® `îÀå@ëæêÎ5@) MOV R4,R0 HALT C05JMP: JMP TIMC05 LEVEL: 0 VECTOR: 320 ENBAD: 167002 MSECS: 10.*1000.+1 DLYCTR: 0 INTCNT: 0 BITFLG: 0 INTFLG: .WORD 0 ENBPAT: 0 INTADS: .WORD 0,INTC,INTB,INTA ;ADDRESSES OF INT RTNES ; DELAY: MOV R5,DLYCTR DLOOP1: MOV #202.,R5  ;1 MSEC LOOP DEC R5 BNE .-2 DEC DLYCTR BNE DLOOP1 RTS PC INTRAD: INTRC,INTRB,INTRA MINSET: 1 MINS: 0 CONTA1: 0 CONTA2: 0 CONTB1: 0 CONTB2: 0 COUNTC: 0 COUNTD: 0 CALIBRATE*TART: NO P/F CHARACTER MOVB COUNT,R1 ;LINE WIDTH: NO P/F CHAR BNE LPDD20 ;WILL USE 'COUNT' SPECIFIED DECB WDCNT ;USE AUTOMATIC LINE WIDTH BNE LPDD10 ;STILL SHRINKING MOVB #66.,WDCNT ;FULL LINE AGAIN LPDD10: MOVB WDCNT,R1 ;TMP'Y HOLD LPDD20: BIT #1,CONSOL ;AUTO MODE? BNE LPDD30 ;YES: NO P/F CHAR INC R1 ;IN P/F MODE: ONE EXTRA WORD +DONE / .PAGE EXEC = . ;THIS IS THE EXECUTIVE SUBROUTINE MOVB NFILES,XFILES ;INIT FILE CTR MOV #WRITAD,XADDR;SET FOR WRITE BUFFER BIT #1,EXCOM ;READ? BEQ NEWFILE ;NO: WRITE MOV #READAD,XADDR;NOW POINT TO READ NEWFIL:MOV NRECS,XRECS ;INIT RECORDS CTR CALDRV:JSR R5,MDRIVE ;CALL DRIVER BR EXEC02 .WORD EXCOM ;COMMAND SET UP PRIOR XADDR: .WORD 0 ;WRITE OR READ BUFR .,Î5öeÖ *Ò‡÷ †€÷•f7Ša¦�Œw‹W÷ŠTúÖ ?*ööŒ7ŒG6Œ‡¦¶ö„ö ýº*Î ø–%‡–%÷54wHýÀê€üÿ÷G>“Jÿáÿ€ Ê›’ðø-: MOV VECTOR,R0 MOV #4,R2 CALB00: MOV INTRAD(R2),(R0)+ MOV R1,(R0)+ DEC R2 DEC R2 BGE CALB00 MOV #WALL,100 MOV R1,102 LOOP: MOV #60.*60.,COUNTD ;INIT MINUTE TIMER MOV MINSET,MINS CLR CONTA1 CLR CONTA2 CLR CONTB1 CLR CONTB2 CLR COUNTC MOV SWR,R0 BIC #-34-1,R0 MOV R. TST -(R0) ;AND ONE WORD SOONER IN BUFFER MOVB PFCHAR,(R0) ;LOAD FIRST BUFF WORD W/P/F CHAR BR LPDE20 ;GO SET UP PRINTER REGISTER... ;BYPASS AUTO PAGE COUNT LPDE90: MOVB HOMECH,R2 ;USE VFU TO SKIP TO TOP-OF-FORM BISB #100,R2 ;COMBINE CHANNEL # AND VFU COMD BIT BR LPDE10 ;GO PUT IT OUT LPDD30: BIT #2,CONSOL ;DOUBLE SPACE? BEQ LPDD40 /WORD XCOUNT ;HOLDS #WDS/RECORD EXEC02:BIT #1,EXCOM ;WAS IT READ? BEQ MORECS ;NO: NO TEST BIT #4,@#SWR ;BYPASS PRINTOUT? BNE MORECS ;YES MOV WRITAD,R1 ;YES: COMPARE BUFFERS MOV READAD,R2 MOV XCOUNT,R5 ;# OF WORDS IN RECORD TO COMPAR .PAGE XLOOP1:DEC R5 ;REACHED END? BMI MORECS ;YES CMP (R1)+,(R2)+ ;COMPARE LIST ENTRY BEQ XLOOP1 ;A10,167002 MOV #100,177546 WAIT BR .-2 INTRA: INC CONTA1 BNE AEXIT INC CONTA2 AEXIT: RTI INTRB: INC CONTB1 BNE BEXIT INC CONTB2 BEXIT: RTI INTRC: INC COUNTC RTI WALL: DEC COUNTD BNE WEXIT MOV #60.*60.,COUNTD DEC MINS BNE WEXIT CLR 167002 MOV #7,177566 HALT BR LOO2 ;NO DECB LINENO ;YES:COUNT TWO LINES LPDD40: DECB LINENO BGE LPDE20 ;NOT END OF PAGE YET MOVB PAGE,LINENO ;REACHED END: RESET BICB #340,HOMECH ;IS VFU OPTION SELECTED? BNE LPDE90 ;YES ;NO: WILL TRY TO SKIP 'N' LINES TSTB PFCHAR ;ALLOWED TO DO A P/F COMMAND? BEQ LPDE20 ;NO: FILL ENTIRE PAGE MOV #66.,R2 ;YES: 3GREE JSR PC,CRLF ;BEGIN NEW LINE FOR PRINTOUT MOV R1,R4 ;CURRENT ADDRESS + 2 SUB WRITAD,R4 ;GET OFFSET + 2 TST -(R4) ;GET CURRENT OFFSET JSR PC,PRINT MOV -2(R1),R4 ;GET CONTENTS OF WRITE BUFFER JSR PC,PRINT MOV -2(R2),R4 ;GET CONTENTS OF READ BUFFER JSR PC,PRINT BR XLOOP1 ; PRINT: JSR PC,PRTNUM JSR PC,FORMAT RTS PC .PAGE MORECS = 4; UPDATE 12/6/72 DSCTST.S08 ; UPDATE 7/6/72 DSCTST.S07 ; UPDATE 6/28/72 DSCTST.S06 ; UPDATE 4/5/72 DSCTST.S05 ; UPDATE 2/10/72 DCSTST.S04 ; UPDATE 1/17/72 DCSTST.S03 ; UPDATE 12/20/71 DCSTST.S02 ; UPDATE 12/17/71 DCSTST.S01 .TITLE DSCTST ;*********************************************************************** ;* 5P WEXIT: RTI PGMEND = . .END 6CALC # OF LINES TO SKIP MOVB PAGE,R3 ;NO SUCH THING AS A BYTE SUBTRACT SUB R3,R2 BIC #-77-1,R2 ;INSURE SKIP-LINE COMMAND LPDE10: MOV R2,-(SP) JSR PC,GETPTY ;GET EVEN PARITY(IF ALLOWED) MOVB (SP)+,PFWORD ;NOW HAVE EITHER SKIP-LINE... ;...OR SKIP-TO-CHANNEL COMMAND ; ; NOW OUTPUT THIS ONE-WORD P/F COMMAND AND WAIT FOR FINISH CLR @#R.LF ;SET MODE TO P/F MO7 . ;HERE AFTER COMPLETION OF COMMAND BIT #4,EXCOM ;CHECK FOR FILE MARK COMMAND BNE FILMRK ;YES: ALREADY DID IT BIT #313,EXCOM;CHECK FOR PER-RECORD COMMAND BEQ MOREFILES;NOT A PER-RECORD COMMAND DEC XRECS ;ANY MORE RECORDS? BNE CALDRV ;YES: GO DO THEM BIT #12,EXCOM ;WAS LAST COMMAND WRITE? BEQ MOREFILES ;NO:DON'T WRITE E-O-F BIT #40000,@#SWR;IS E-O-F OPTION SELECTED ? BEQ MORG * ;* DISC TEST PROGRAM * ;* * ;* START PROGRAM: * ;* COMPUTER HALTS- ENTER START SECTOR IN SWITCHES * ;* AND CONTINUE. * ;* COMPUTER HALTS- ENTER NO. OF WORDS IN XFER * ;* AND CONTINUE. FDE MOV #PFWORD,@#R.AD ;ADDRESS OF LINE/CHANNEL COMMAND WORD MOV #-1,@#R.WC ;ONLY ONE WORD MOV #4000,@#R.CM ;!!!!!COMMAND PRINT!!!!!! TST @#R.ST ;WAIT FOR DONE BEQ .-4 LPDE20: MOV R0,@#R.AD ;BUFFER START ADDRESS NEG R1 ;WORD COUNT IS NEGATIVE MOV R1,@#R.WC ;OUTPUT WORD COUNT MOV CONSOL,R0 ;GET SWITCH OPTIONS MOV R0,@#R.LF ;SET UP AEEFILES ;NO:NO WRITE E-O-F MOV EXCOM,R0 ;CURRENT COMMAND BIC #146777,R0 ;LEAVE INTRT ABLE & UNIT SELECT BIS #4,R0 ;SET WRITE FILE MARK MOV R0,EOFCOM ;CREATE CORRECT E-O-F COMMAND WRTEOF:JSR R5,MDRIVE ;WRITE FILE MARK BR MOREFILES .WORD EOFCOM ; MOREFI = . ;CHECK FOR MORE NON-SPACE ;RECORD OR FILE COMMANDS BIT #73,EXCOM BEQ EXRTN ;NOT RECORD OR FI"""""""Dˆˆˆˆˆˆˆ """"""""""""""""""@DDDDD@DDDDDDDDDDDDD€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆDDDDDDADDB (B Cu~&•{' 5›u~&¡K'  ›dTo8’{' 4Ù›dTo8¡K' ›„Mo84d' &®›„Mo8¡K' ,›û €–{' 0§›û €¡K' HP›ô&¶{' T*ø›ô&¡K' «¿›<H…¡K² â›$DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwwwWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅ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 & ILE COMMAND FILMRK: ;DONE WRITING FILE MARK DECB XFILES ;MORE FILES? BNE NEWFILE ;YES EXRTN: RTS PC ;EXIT EXEC ROUTINE .PAGE ; MAG TAPE DRIVER ; ; CALLING SEQUENCE ; JSR R5,MDRIVE ; BR NEXT ; .WORD A(COMMAND) ; .WORD A(MEM ADDR) ; .WORD A(COUNT) ; ;THIS IS THE MAG TAPE DRIVER ROUTINE MDRIVE:CLR R3 ;RESET ERROR NUMBER MOV @2(R5),R1 ;COMMAND BIJUTO OR P/F MODE SWAB R0 BIC #37777,R0 ;GET INTERRUPT ENABLE BITS BIS #4000,R0 ;SET 'START' BIT ;////////////////////////////////////////////////////////// MOV R0,@#R.CM ;!!!!!!!P R I N T!!!!!!!! ;////////////////////////////////////////////////////////// ; MOV #LPDI20,200 ;SET INTERRUPT VECTOR TO THE ROUTINE JSR PC,LPDC ;USE THIS TIME TO CREATE NEXT BUFFER ; ;------------------------------- ; K * ;* NOTE: MAX. OF 3072 WORDS. * ;* COMPUTER HALTS- ENTER FUNCTION AS FOLLOWS * ;* AND CONTINUE: * ;* BIT 15: = 0, WILL USE DATA GIVEN * ;* TO SET UP AND COMPARE BUFFER * ;* BIT 15: = 1, USER RESPONSIBLE FOR * ;* BUFFER. Lß0ßû €.,ÀÆÀ÷˜zæ÷ væ7,æ÷ŽåÔÿÀ†å ƒÀ 7Âÿ7 ÈÿÀnåÀED, øÿ  · ¶ÿ÷\å¦ÿ÷E ÿ÷Ušÿ÷Hå’ÿ_,2÷@åŒÿ÷5„ÿ÷0å†ÿ÷rÿ‚ÿÀpÿ�Ã,XlÿÀ5 ÂÀÄXÿa„`7XÿÒÀ5÷5@ì,~Dÿƒ · BÿôÀEüÿ76ÿ÷À,Ð÷&ÿ$Ð7 Ð÷ž,¤ÿб@  ÷‹ÿ �7Є þ÷‹Ð�À^ÀU ,Ê@7 üþ7ìÏ÷ ôþ„ ûñÀÜÏO�÷ Úþ�÷%,ðÖþÂÀÃÊþÒ ÷5@¾þƒ · ¼þöÀMC #147777,R1 ;UNIT # CMP R1,CURUNT ;SAME AS PREVIOUS? BNE MDRV02 ;NO MDRV01:CLRB EXSWCH ;NORM EXIT SWITCH MOV CURUNT,@#MTC;SELECT UNIT IN CASE RESET JSR PC,DELAY ;MUST WAIT BEFORE STATUS CHECK BIT #100,@#MTS ;CTRLR BUSY? BNE ERR2 ;YES BIT #200,@#MTS ;READY? BEQ ERR3 ;NO BIT #16,@2(R5) ;WRITE REQUEST? BEQ MDRV06 ;NO: NO FPT CHECK BIT #1,@#MTS ;WRIN ; NOW WE WAIT HERE UNTIL EITHER THE INTERRUPT COMES (IF ENABLED) ; ..OR UNTIL 'DONE' COMES UP (IF INTERRUPT NOT ENABLED). ; ERROR STOPS ARE PROVIDED FOR STATUS ERRORS, UNEXPECTED INTERRUPTS, ; OR NO RESPONSE AFTER A MAXIMUM ALLOWED TIME INTERVAL. LPDF10: MOV TIMOUT,TIMER ;SET MAXIMUM TIMER LPDF12: MOV @#R.ST,R1 ;FETCH STATUS BMI LPDF20 ;'DONE' IS UP!! COM R1 ;INVERT ALL BITS THAT SHOULD BE SET BIT #4000O * ;* BIT 14: = 0, IF 15=0 THEN USE * ;* DATA BUFFER FILLED WITH DATA * ;* BIT 14: = 1, IF 15=0 THEN DATA BUFFER * ;* FILLED WITH DATA,DATA+1,DATA+2,... * ;* BIT 13: = 1, INCREMENT DATA AFTER * ;* EACH CYCLE SO DATA BUFFER WILL CHANGE * ;* EACHP„,6÷ ²þ÷5 þ÷E˜þ÷U’þŽ÷EŠþ÷Us,<„þ÷5~þ· tþ÷-pþ~þƒ÷zþfþ÷5dþÚ,b÷5 Zþ ÷5Pþw¸þ· HþöwÌþ÷5ƒˆ:þ÷,Ïwèÿ· 0þ®øQTE PROTECT? BNE ERR4 ;YES .PAGE MDRV06: MOV #100,@#TKS ;RESET CONTROLLER (CLEAR STAT & COMMAND) BIT #13,@2(R5) ;IS IT EITHER READ OR WRITE? BEQ MDRV03 ;NO: NOT BUFFER COMMAND BIT #1,@2(R5) ;IS IT READ? BEQ MDRV07 ;NO: SKIP BUFFER CLEAR MOV READAD,R0 ;CURRENT READ BUFFER BEGIN MDRV08: CLR (R0)+ ;CLEAR READ BUFFER CMP R0,#READBF+BUFLTH-2 ;REACR2,R1 ;TEST BUSY AND ON-LINE FOR SET BEQ LPDF70 ;ALL ARE SET ERR030: SCOPE ;ERROR: ONE OF THEM WAS NOT SET LPDF70: COM R1 ;BACK TO NORMAL BIT #31,R1 ;TEST FOR ERRORS BEQ LPDF80 ;GOOD: NONE IS SET ERR040: SCOPE ;ERROR:AT LEAST ONE OF ABOVE IS SET LPDF80: DEC TIMER ;WAIT FOR 'DONE' OR INTERRUPT BNE LPDF12 ;KEEP LOOPING CLR @#R.CM S CYCLE. * ;* BIT 12: = 1, INCREMENT SECTOR AFTER * ;* EACH CYCLE. * ;* BIT 11: = 1, HALT AFTER END SECTOR * ;* REACHED, OTHERWISE LOOP BACK TO * ;* BEGIN SECTOR. * ;* BIT 9: = 0, IF ERROR OCCURS-HALT * ;* UHED BUFFER LIMIT? BLOS MDRV08 ;NOT YET MDRV07: ;CONTINUE MOV @4(R5),@#MTA ;LOAD MEM ADDR REG MOV @6(R5),@#MTN ;LOAD COUNTER REG MDRV03:MOV @2(R5),R0 ;FETCH COMMAND WORD FROM LIST MDRV3A:MOV R0,R2 ;TEMPORARY SWAB R2 BIC #177775,R2;GET INT ABLE BIT MOVB R2,MINTFG ;SAVE (EITHER 10 OR 0) CLR @#MTS ;STATUS REG RESET ;****************************************************** MOV R0,@#MTC ;LOV ;DISABLE INTERRUPT: TIMER IS ZERO ERR050: SCOPE ;ERROR: TIME'S UP: NO FINISH ; LPDF20: BIT #40031,R1 ;TEST BUSY AND ERRORS BEQ LPDF40 ;NONE UP: O.K. ERR060: SCOPE ;STATUS ERROR WITH 'DONE' LPDF40: TSTB CONSOL ;WAS THE "DONE" INTERRUPT ENABLED? BPL LPDG00 ;NO: THIS IS THE CORRECT SEQUENCE MOV DONDLY,R3 ;ENABLED: WAIT FOR INTERRUPT... DEC R3 ;...FOR AW BIT 9: = 1, IF ERROR OCCURS-CLEAR * ;* DISC AND RETRY(ERROR LOOP). * ;* BIT 8: = 0, WILL HALT AND WAIT FOR * ;* DATA RESPONSE AFTER EACH I/O COMPLETE. * ;* BIT 8: = 1, WILL CONTINUALLY REPEAT * ;* XFER UNTIL ERROR OCCURS (LOOP MODE). * ;* BIT 7: = 0, XFER WITHOUT DISC * ;* X ; UPDATE 10/26/72 CALDGN.S10 ; UPADTE 10/26/72 CALDGN.S09 ; UPDATE 10/25/72 CALDGN.S08 ; UPDATE 10/24/72 CALDGN.S07 ; UPDATE 10/4/72 CALDGN.S06 ; UPDATE 9/20/72 ADD WRAP AROUND CHECK ; UPDATE 9/12/72 CALDGN.S04 ; UPDATE 9/6/72 CALDGN.S03 ; UPDATE 9/6/72 CALDGN.S02 .TITLE CALDGN ;*********************************************************************** ;*YAD COMMAND REGISTER: ;INITIATES TAPE OPERATION ;****************************************************** JSR PC,DELAY ;MUST WAIT BEFORE CHECKING STATUS .PAGE MDRV05: BIT #1000,@2(R5) ;INTRPT ABLED? BEQ BUSYCK ;NO: CHECK BUSY LOADCK: ;LOAD-POINT CHECK BIT #2,@#MTS ;AT LOAD POINT? BNE BUSYCK ;YES: WAIT FOR BUSY TO CLEAR TSTB MINTFG ;ZDDITIONAL DELAY... BNE .-2 ;...BETWEEN 'DONE' AND INTERRUPT CLR @#R.CM ;DISABLE INTERRUPT ERR070: SCOPE ;SHUCKS, INTERRUPT NEVER CAME ; ; ENTER HERE AFTER A SUCCESSFUL 'DONE' WITHOUT INTERRUPT ENABLED ; LPDG00: JSR PC,LPD.ST ;GO MAKE A COMPLETE STATUS CHECK FIRST ERR080: SCOPE ;STATUS ERROR RETURN BIT #4,CONSOL ;IS "STALL" SELECTED OUT FRONT? BEQ LPDG50 ;NOT TO[ INTERRUPT. * ;* BIT 7: = 1, USE DISC INTERRUPT. * ;* BITS 2:0 = I/O FUNCTION * ;* 0 = NOP * ;* 1 = WRITE * ;* 2 = READ * ;* 3 = WRITE CHECK * ;* \ * ;* STORAGE ALLOCATOR DIAGNOSTIC * ;* * ;* START AT 12000 - COMPUTER HALTS AT: ;* FOR INPUT FUNCTION ;* FOR SB/NOB IF REQUIRED. ;* FOR ERROR INDICATIONS WHICH ARE: ;* 100000 IF TIME OUT ]INTRPT ABLED: WATCH FLAG BNE LOADCK ;NO INTRPT YET: CHECK LOAD POINT AGAIN EXIT: TSTB EXSWCH ;EXIT OR RETURN? BNE MDRV01 ;BACK AFTER NEW UNIT SELECT MOV @#MTS,STAT;SAVE STATUS BIT ERRPAT,STAT;SEE IF ANY ACTIVE ERRORS BNE ERR5 ;YES:OPERATOR MUST DUMP STATUS RTS R5 ;EXIT DRIVER ; BUSYCK:BIT #100,@#MTS;CHECK "BUSY" BIT BNE BUSYCK ;STILL BUSY BR EXIT ;BUSY BIT IS CLE^DAY ; STALL FOR A RANDOM # OF M-SECS BETWEEN 8 AND 1023. MOV SEED,R0 ;SEED (=RNUM(N-1)) ROL R0 ROL R0 ; X4 ADD DAMP,R0 MOV R0,-(SP) ;RNUM(N)=4*RNUM(N-1)+DAMP(N-1) ROL R0 ROL R0 ADD DAMP,R0 ROL R0 ROL R0 MOV R0,DAMP ;DAMP(N)=64*RNUM(N-1)+20*DAMP(N-1) ; RANDOM NUMBER NOW GENERATED AND ROUTINE READIED FOR NEXT TIME _ 4 = WRITE THEN READ * ;* NOTE: A CYCLE IS THE WRITE * ;* THEN READ. * ;* COMPUTER HALTS- DATA REQUEST HALT: * ;* IF FCN BIT 15 IS SET USER MAY NOW * ;* SET OR CHECK DATA BUFFER, OTHERWISE, * ;* DATA IN SWITCHES WILL BE USED. * ;* `ON HARDWARE ;* 040000 FOR OTHER HARDWARE ERROR ;* 1 AFTER A DEALLOCATE * ;* 2 AFTER AN ALLOCATE * ;* 3 BIT MAP COMPARE AFTER * ;* ANY SEARCH * ;* 4 FR COMPARE AFTER ANY SR* ;* 5 AR COMaARED ; DELAY: MOV #20,R0 ;MUST WAIT SHORT TIME BEFORE DEC R0 ;MAKING FIRST CHECK ON STATUS BNE .-2 RTS PC ; MDRV02:BIT #100,@#MTS;TEST CTRLR STATUS "BUSY" FLAG BNE ERR1 ;OLD UNIT STILL BUSY INCB EXSWCH ;SET SWITCH TO RE-ENTER ROUTINE MOV @2(R5),R0 ;AFTER NEW SELECT BIC #146777,R0 ;GET NEW UNIT # & INT ABLE MOV R0,R1 BIC #147777,R1 MOV R1,CURUNT ;SAVE NEW UNIT # b BIC #177007,(SP)+ ;MASK 10 BR LPDC70 ;GO SEE IF BUF IS FULL ; ;------------------------------- ; THIS IS THE ERROR STATUS ‡A BUFFER WITH PATTERN CLR R3 ; NO-CLEAR DATA BUFFER FOR READ TST016: MOV #BUF,R2 ; BUFFER ADDRESS MOV WORDCT,R4 ADD R4,R4 ADD R2,R4 ; TO THIS ADDRESS MOV R4,EXTENT ; SAVE FOR FUTURE USE TST020: MOV R3,(R2)+ BIT #1.,R0 ; WRITE OR WRITE CHECK? BEQ TST025 ; NO BIT #40000,FCN ; YES-INCREMENTAL DATA PATTERN? BEQ TST025ˆLOCATION TABLE ALRR = 162020 ; ALLOCATOR REQUEST REGISTER ALAR = 162022 ; ALLOCATOR ANSWER REGISTER ALFR = 162024 ; ALLOCATOR FUNCTION REGISTER ; ; FLD1: .WORD 0 ; START TYPE FLD2: .WORD 0 ; SINGLE OR LOOP FLD3: .WORD 0 ; SB/NOB FLD4: .WORD 0 ; FUNCTION FLD5: .WORD 0 ; USE SOFTWARE ALLOC. TO CHECK OUT ; A: .WORD 0 ; WORK WORDS‰NY DATA ENTERED? BNE DLIST ;YES: GO LOAD IT ;FILL LIST WITH INTEGER SEQUENCE: 1,2,3....N MOVINS:MOV R3,(R4)+ ;LOAD WORD (OR BYTE) INC R3 ;EACH ONE INCREMENTING CMP R4,#WRITBF+BUFLTH ;REACHED END? BLO MOVINS ;NOT YET DLGRTN:JMP DIALOG ;COMMON EXIT TO BEGIN DIALOGUE DDUMP: TST R3 ;ANY ADDRESS? BNE ADRSPC ;YES MOV #WRITBF,R1 ;NO:USE WRITE BUFFER MOV #WRITBF+BUFLTH-2,RŠCHECK MADE @ BEGIN AND AFTER EACH LINE LPD.ST: MOV @#R.ST,-(SP) ;PUSH STATUS ONTO STACK BIT #40031,(SP) ;ANY ERROR BITS SET? BNE LPDS50 ;YESSIR: GO FOR ERROR RETURN BIT #2,(SP) ;TEST ON-LINE BEQ LPDS50 ;ON-LINE NOT SET ADD #2,2(SP) ;BUMP RETURN ADDRESS FOR GOOD EXIT LPDS50: TST (SP)+ ;POP STATUS OFF STACK RTS PC ;TAKE EITHER ERROR OR GOOD RETURN ; ‹ ; NO INC R3 ; YES TST025: CMP R2,EXTENT ; FINISHED? BLT TST020 ; NO SIO: BIC #177774,R0 ; ISOLATE I/O FDN REQUESTED MOV R0,FCNSW ; SAVE FOR LATER USE MOV #BUF,CMA ; SET UP CURRENT MEMORY ADDRESS MOV WORDCT,WCR ; SET UP WORD NEG WCR ; COUNT REGISTER MOV SECTOR,DAR ; SET UP START SECTOR SEC Œ B: .WORD 0 ; USED FOR C: .WORD 0 ; EXCLUSIVE OR ; ; STORAGE FOR OLD TABLE AND REGISTERS PRESTR: .BLKW 16.+3.+2. ; LALAR: .WORD 0 ; LAST HARDWARE AR AFTER A SEARCH ; SBNOB: .WORD 0 ; DELAY: .WORD 150 ; FOR DELAY DURING CHECKOUT ; SMASK: .WORD 3400 ; MASK OUT UNWANTED SEARCH SBS ; NERROR: .WORD 0 ; # OF ERRORS ; NLOOP: .WORD 0 ; NUMBER�5 ;SET BUFFER END POINTER PRTDAT:MOV (R1)+,R4 ;FETCH WORD (BYTE) JSR PC,PRTNUM ;PRINT IT JSR PC,FORMAT ;,CAN BE STOPPED BY "HALT" CMP R1,R5 ;REACHED END OF BUFFE? BLOS PRTDAT ;KEEP GOING BR DLGRTN ;YES ADRSPC:MOV (SP)+,R1 ;SET LOW ADDR (IF ONLY ONE LIMIT MOV R1,R5 ;SET HIGH ADDR LIMIT SETHI: TST -(R3) TST R3 ;ONLY ONE DATUM? BEQ PRTDAT ;YES MOV (SPŽ .PAGE ; THIS IS THE 'GET PARITY' SUBROUTINE. IT SETS/CLEARS THE PARITY ; BIT IN THE 7-BIT CHARACTER WHICH IS ON TOP OF THE STACK ON ENTRY, ; BUT ONLY IF BIT SWITCH #15 ON THE CONSOLE IS SET. OTHERWISE ALL ; PARITY BITS WILL BE CLEAR, WHICH IS CORRECT FOR ABOUT HALF OF THEM GETPTY: TST CONSOL ;IS PARITY OPTION SELECTED? BPL GETPEX ;OPTION NOT SELECTED MOVB #7,PTYCNT ;WILL TEST SEVEN BITS CLRB PARITY ;WILL � ; FOR GO BIT ROL R0 ; SET FUNCTION AND GO BITS CLR R4 ; USE TO COUNT DELAY TSTB FCN ; INTERRUPT MODE REQUESTED? BMI TST040 ; YES MOV R0,DCS ; START I/O FUNCTION TST030: INC R4 ; DELAY A LONG TIME BNE TST030 TSTB DCS ; CONTROLLER READY BMI IOCOMP ; YES-I/O COMPLETE TST035: MOV #1.,R0 ; NO-SHO� OF LOOPS ; OSBNOB: .WORD 0 ; LAST SB/NOB USED TO START A FUNCTION. ; .PAGE ; ; ; START = . ; HERE IS THE REAL BEGINNING. CLR NERROR CLR NLOOP MOV #CALDGN,SP ; SET STACK POINTER MOV #-1.,SBNOB ; INITIALIZE CALDG1: HALT ; WAIT FOR TEST INFORMATION CALDG2: MOV SWR,R0 SWAB R0 ASR R0 ASR R0 ASR R0 BI‘)+,R1 ;SET LOW LIMIT BR SETHI ;GO CHECK FOR EMPTY STACK DLIST: MOV SP,DNDEX ;INIT INDEX TO POINT AT STACK DLIST1:MOV R3,R5 ;INIT STACK INDEXER TST -(R5) ;LESS ONE SINCE 1ST WD INDEX=0 TST R5 BLT DLIST1 ;LIST DEPLETED:BEGIN AGAIN DMOVE: MOV 0(R5),(R4)+;TRANSFER WORD (OR BYTE) TO BUFF DNDEX = .-2;LABEL FOR INDEX IN "DMOVE":REF'D @ DLIST CMP R4,#WRITBF+BUFLTH BHIS DLGRTN ;BUFFER FULL: EXIT ’ACCUMULATE BIT COUNT HERE MOVB 2(SP),-(SP) ;CREATE WORKING CHARACTER GETP10: RORB (SP) ;SHIFT OFF LOW BIT ADCB PARITY ;ACCUMULATE DECB PTYCNT ;MORE BITS? BNE GETP10 ;MORE! TST (SP)+ ;;POP WORKING CHAR OFF STACK ASLB 2(SP) ;;POSITION CHAR TO ACCEPT PARITY BIT RORB PARITY ;LOAD 'C' WITH PARITY BIT RORB 2(SP) ;SHIFT PARITY BIT I“ULD HAVE COME IN BY NOW BR ERROR ; ERROR ; ; SIO WITH INTERRUPT REQUEST PROCESSOR ; TST040 = . BIS #100,R0 ; SET INTERRUPT ENABLE CLR INTSW ; RESET INTERRUPT SWITCH MOV R0,DCS ; START I/O FUNCTION TST050: TST INTSW ; RECEIVE INTERRUPT? BNE IOCOMP ; YES-I/O COMPLETE INC R4 ; DELAY A LONG TIME BNE TST050 BR ”C #177761,R0 ; ISOLATE FIELD 1 - WORD INDEX MOV R0,FLD1 MOV SWR,R0 SWAB R0 BIC #177761,R0 ; ISOLATE FIELD 2 - WORD INDEX MOV R0,FLD2 MOV SWR,R0 ASR R0 ASR R0 ASR R0 ASR R0 ASR R0 BIC #177761,R0 ; ISOLATE FIELD 3 - WORD INDEX MOV R0,FLD3 MOV SWR,R0 ASR R0 ASR R0 BIC #1•BR DLIST1+2 ;CONTINUE FILLING BUFFER ; ; PRTNUM = . ;PRINT NUMBER SUBROUTINE MOV R0,-(SP) ;SAVE USED REGISTERS MOV R3,-(SP) MOV #6,R0 ;DIGIT COUNT FOR "PRINT A NUMBER" MOV R4,R3 ;# TO PRINT CLR R4 ;1ST DIG ASL R3 ROL R4 BR PRT020 PRT010:CLR R4 ;NEXT 5 DIGS ASL R3 ROL R4 ASL R3 ROL R4 ASL R3 ROL R4 PRT020:ADD –NTO CHARACTER GETPEX: RTS PC ;BACK WITH CHARACTER ON TOP OF STACK ; ; ; THE FOLLOWING SUBROUTINE IS A BASIC 1-MILLISECOND DELAY. ; IT LOOPS FOR 'N' MILLISECONDS, WHERE 'N' IS THE NUMBER ON TOP ; OF THE STACK ON ENTRY. THE STACK IS CLEARED BEFORE EXIT. ; DELAY: MOV 2(SP),-(SP) ;PUT 'N' FORWARD MOV 2(SP),4(SP) ;PUT RETURN ADDRESS BACK ONE WORD DELAY1: MOV #132.,2(SP) ;BASIC DELAY FOR 1 M-SEC DELAY2: DEC 2(SP) ;COUNT I—TST035 ; TOO LONG-ERROR ; ; I/O COMPLETE-READY OR INTERRUPT ; IOCOMP = . MOV DCS,R0 ; GET ERROR INFO. BMI ERROR ; WHOOPS-ERROR TST FCN ; USER BUFFER SET-UP BMI RSTART ; YES-RESTART CMP #2.,FCNSW ; WAS IT A READ FUNCTION? BNE RSTART ; NO MOV #BUF,R2 ; COMPARE DATA IN BUFFER MOV DATA,R3 TST060: CMP R3,(R2˜77761,R0 ; ISOLATE FIELD 4 - WORD INDEX MOV R0,FLD4 MOV SWR,R0 BIC #177770,R0 ; ISOLATE FILED 5 MOV R0,FLD5 JSR PC,SAVE ; SAVE OLD TABLE AND REGISTERS MOV FLD1,R5 ; GET READY TO INITIALIZE BIT MAP JMP @INIT(R5) ; DO IT INIT = . .WORD INIT0 ; CLEAR ALLOCATION TABLE .WORD INIT1 ; SET ALLOCATION TABLE .WORD INIT2 ™ #60,R4 ;MAKE TTY CHR JSR PC,OCH ;PRINT CHAR DEC R0 ;DONE? BGT PRT010 ;NO MOV (SP)+,R3 ;RESTORE REGISTERS MOV (SP)+,R0 RTS PC ;RETURN ; ; FORMAT:INCB PPOS ;POSITION POINTER CMPB PPOS,#10 ;8 POS PRINTED? BGE FOR020 ;YES:NEW LINE MOV #40,R4 ;NO:OUTPUT 2 SPACES JSR PC,OCH JSR PC,OCH RTS PC FOR020:JSR PC,CRLF ;DO RETURN &LFšT, MAN BNE DELAY2 ;KEEP GOING... DEC (SP) ;THIS IS THE # OF M-SECS TO DELAY BNE DELAY1 ;OUTER LOOP STILL HOT CMP (SP)+,(SP)+ ;POP 'N' AND LOCAL COUNTER OFF STACK RTS PC ;GO BACK ; ; ; THIS IS THE SCOPE ROUTINE. IF BIT SWITCH #3 IS NOT SET, ANY ; ERROR WILL CAUSE STOP HERE, WITH STATUS DISPLAYED IN "DATA" LIGHTS. ; IF THE SWITCH IS SET, ALL ERRORS WILL FALL THROUGH HERE, AND ; T›)+ BNE TST070 ; UH-OH BIT #40000,FCN ; INCREMENTAL PATTERN? BEQ TST065 ; NO INC R3 ; YES TST065: CMP R2,EXTENT ; FINISHED BLT TST060 ; NO BR RSTART ; YES-RESTART TST070: MOV #2.,R0 ; ERROR-DID'NT READ EXPECTED DATA BR ERROR ; ; RESTART TEST AS DEFINED IN FCN ; RSTART = . TST RDWTSW ; READ Wœ ; USE PRESENT TABLE CONDITION .WORD INIT3 ; SET UP 101010.... INIT0 = . CLR R0 ; SB/NOB = 0 JSR PC,DALLO ; DEALLOCATE WHOE THING BR GETADR INIT1 = . CLR R0 JSR PC,ALLO ; ALLOCATE WHOLE THING BR GETADR INIT2 = . TST FLD5 ; SOFTWARE TOO? BEQ GETADR ; NO MOV #-32.,R5 ; YES INIT� RTS PC ; ; ; OUTPUT A CHARACTER ; OCH: TSTB @#TPS ;TTY READY? BPL OCH ;NO MOVB R4,@#TPB ;YES:OUTPUT CHAR RTS PC ; ; TTYINT:MOVB @#TKB,TTYTMP ;TTY KB INTERRUPT BICB #600,TTYTMP;CLEAR CHANNEL EIGHT CMPB #'H,TTYTMP ;IS CHAR HALT CHAR "H"? BNE FLGTST ;NO BIT #2,@#SWR ;CHECK FOR "RESET" OPTION BEQ DLGRTN ;NOT SELECTED: NO RESET JMP HALT ;YES:GO STOP UNITS žHE DIAGNOSTIC WILL CONTINUE IN SPITE OF THEM ; SCOPEI: CMP (SP)+,(SP)+ ;IT IS ENTERED BY EMT: POP STACK BIT #10,CONSOL ;IS "SCOPE" BIT SET? BEQ SCOPE1 ;NO: THEN HALT SCOPE2: JMP LPDD ;IS SET: THEN CONTINUE SCOPE1: MOV @#R.ST,R0 ;DISPLAY STATUS IN LIGHTS STOP03: HALT ;FIRST HALT TO DISPLAY STATUS MOV -4(SP),R0 ;NOW SHOW THE ADDRESS OF THE ERROR STOP04: HALT ;...DURING THE ŸRITE REQUEST? BEQ RST020 ; NO BIT #2,FCN ; FINISHED A READ? BNE RST010 ; YES BIC #7,FCN ; NO BIS #2,FCN ; SET TO READ BR TST015 RST010: BIC #7,FCN BIS #1,FCN ; SET TO WRITE AND START NEW CYCLE RST020 = . BIT #10000,FCN ; SECTOR INCREMENT? BEQ RST030 ; NO INC SECTOR CMP SECTOR,END 21: MOV ALLTBL+32.(R5),A MOV #-1.,B MOV A,C BIC B,C BIC A,B BIS C,B ; PERFORM EXCLUSIVE OR MOV B,BITTBL+32.(R5) ; SET UP SOFTWARE TABLE ADD #2,R5 ; BUMP BLT INIT21 BR GETADR INIT3 = . MOV #125252,R0 ; ALTERNATE 1'S AND 0'S MOV #-32.,R5 INIT31: MOV R0,ALLTBL+32.(R5) ; SET IN ALLOCATOR TABLE AD¡FIRST FLGTST:TSTB REQFLG ;REQUEST PENDING? BEQ TYEXIT ;NO CLRB REQFLG INCB CHRFG ;INDICATE CHAR READY TYEXIT:RTI ; ; ICH: INCB REQFLG ;INPUT A CHARACTER & ECHO IT TSTCH: TSTB CHRFG ;IS ONE AVAILABLE BEQ TSTCH ;NO CLRB CHRFG ;CLEAR READY FOR NEXT TIME MOVB TTYTMP,R4 ;YES CMP R4,#CR ;IS THIS A CARRIAGE RETURN? BNE ECHO ;NO: GO ECHO IT JSR PC,CRLF ;YES: OU¢SECOND HALT BR SCOPE2 ;GO AGAIN AFTER 'CONTINUE' ; ; BYTLST = . ;LIST OF PARAMETER BYTES... ; ...LOADED AT BEGIN OF RUN PFCHAR: .BYTE 0 ;HOLDS PAPER-FEED CHARACTER, IF ANY COUNT: .BYTE 0 ;HOLDS WORD COUNT FOR LINE WIDTH PAGE: .BYTE 0 ;HOLDS NUMBER OF LINES PER PAGE HOMECH: .BYTE 0 ;HOLDS CHANNEL # FOR TOP-OF-FORM, SPEED: .BYTE 0 ;HOLDS MINIMU£SCT ; END? BLOS RST030 ; NOT YES MOV STSCT,SECTOR ; RE-PRIME START SECTOR BIT #4000,FCN ; HALT OR CONTINUE BEQ RST030 ; GO HALT ; WAIT RST030: BIT #20000,FCN ; INCREMENT DATA FOR CHANGE? BNE RST200 ; YES RST100: CLR R0 ; SIGNIFY NO ERROR BIT #400,FCN ; LOOP REQUEST? BNE RST300 JMP TST012 RST200: INC DATA ¤D #2,R5 ; BUMP BLT INIT31 ; NOT DONE YET BR INIT2 ; CHECK FOR SOFTWARE CHECK ; GETADR = . JSR PC,GETSB ; GO GET SB/NOB BR FCTN GETSB = . MOV FLD3,R5 ; GET SB/NOB FIELD JMP @SB(R5) ; DO IT SB = . .WORD SB0 ; SET BY OPERATOR .WORD SB1 ; SET BY INCREMENT FROM 0 .WORD SB2 ; ¥TPUT LF, TOO RTS PC ; ECHO: JSR PC,OCH ;ECHO ON TTY RTS PC ;CHAR IS IN R4 ; ; CRLF: MOV R4,-(SP) ;SAVE MOV #5015,R4 ;CR & LF JSR PC,OCH ;PRINT LOW BYTE SWAB R4 JSR PC,OCH CLRB PPOS ;RESET FOR POSSIBLE FORMAT MOV (SP)+,R4 ;RESTORE RTS PC ; ; ; OUTPUT N CHARS ; CALLING SEQUENCE: ; JSR R5,ONCH ; .WORD BUFADR ADDRESS OF FIRST (LOW) CHARACTER ¦M DELAY AFTER PRINT CNTR16: .BYTE 0 ;COUNTER FOR OPTIMUM SET LINENO: .BYTE 0 ;CURRENT LINE NUMBER PARITY: .BYTE 0 ;USED TO CALC CHARACTER PARITY PTYCNT: .BYTE 0 ;...ALSO SCHAR: .BYTE 0 ;SYNTHETIC FIRST CHARACTER WDCNT: .BYTE 0 ;WORD COUNT (LINE WIDTH) .EVEN PFWORD: .WORD 0 ;HOLDS P/F CHAR FOR T-O-F IN AUTO MODE BOUNDL: .WORD 377 ;LOWER BUFFER BOUNDARY BOUNDH: .W§ BR RST100 RST300: JMP TST015 ; ; ERROR ERROR ERROR ; ERROR = . BIT #1000,FCN ; CLEAR AND RETRY REQUEST? BNE ERR1 ; YES HALT ERR1: MOV #400,DCS ; CLEAR DISC JMP RST300 ; ; DISC INTERRUPT HANDLER DSCINT = . INC INTSW ; BUMP INTERRUPT RECEIVED FLAG RTI ; .END ¨SET BY RANDOM NUMBER GENERATOR .WORD SB2 ; 3 LOOKS LIKE 2 SB0 = . HALT ; WAIT FOR SWITCH SET WITH SB/NOB MOV SWR,SBNOB ; SET IT RTS PC SB1 = . INC SBNOB ; INCREMENT RTS PC SB2 = . JSR PC,RANDOM ; GENERATE RANDOM NUMBER RTS PC ; FCTN = . INC NLOOP MOV SBNOB,R0 ; GET START SB© ; .WORD NCHAR # OF CHARS ; ONCH: MOV (R5)+,R0 ;BUF ADR MOV R1,-(SP) ;SAVE IT MOV (R5)+,R1 ;# CHARS ONC010:MOVB (R0)+,R4 ;OUTPUT CHAR JSR PC,OCH DEC R1 ;DONE? BGT ONC010 ;NO MOV (SP)+,R1 ;RESTORE RTS R5 ; INPUT CHARS FROM TTY UNTIL CR ; CALLING SEQUENCE -- ; JSR R5,INCH ; .WORD BUFADR LOW BUF ADR ; .BYTE MAXCH MAX # CHARS ; .BYTE # CHARSªORD LP.DGN-37 ;UPPER BUFFER BOUNDARY CURBUF: .WORD 0 ;BEGINNING OF CURRENT BUFFER CURBND: .WORD 377  ;END OF CURRENT BUFFER TIMOUT: .WORD 3200. ;# OF 31-MICROSEC WAIT-LOOPS FOR INT TIMER: .WORD 0 ;USED TO TIME IT OUT DONDLY: .WORD 202. ;WAIT AFTER 'DONE' FOR INT: 1 MILLISEC DAMP: .WORD 1233 ;FIRST TERM FOR RANDOM # GENERATOR SEED: .WORD 7622 ;FIRST SEED FOR ABOVE CONSOL: 0 ¬/NOB FOR ALL MOV R0,OSBNOB ; AND SAVE FOR A REPEAT (LOOP #4) MOV FLD4,R5 ; GET FUNCTION TYPE JMP @FCTNP(R5) ; FUNCTION PROCESSOR FCTNP = . .WORD FCTN0 ; SEARCH .WORD FCTN1 ; SEARCH MIN. .WORD FCTN2 ; ALLOCATE .WORD FCTN3 ; DEALLOCATE .WORD FCTN4 ; ALLOCATE-DEALLOCATE .WORD FCTN5 ; SEARCH-ALLOCATE-SWAB-DEALLLOCA­ READ INCH: MOV (R5)+,R0 ;GET BUF ADR MOV R1,-(SP) ;SAVE IT MOVB (R5)+,R1 ;GET MAX CHAR CNT CLRB (R5) ;INIT COUNT INC010:JSR PC,ICH ;GET A CHAR CMPB R4,#215 ;CR? BEQ INC020 ;YES INCB (R5) ;CHR CNT CMPB (R5),R1 ;TOO MANY? BGT INC010 ;YES: IGNORE UNTIL CR MOVB R4,(R0)+ ;PUT IN BUF BR INC010 ;NEXT INC020:INC R5 ;BUMP TO RETURN MOV (S® ;HOLDS CONSOLE OPTIONS .END ¯Ìô&›$®,<h7 öÿ7 ôÿÆ÷ÿÿâÿÀëò,bÀ€ € € ÀEñÿ7�ÿÀëÀÀEñÿ7„ÿÀôê€ € ,ˆ€ € € ÀEñÿ7pÿÀÞê€ € ÀEñÿ7bÿÀÎêÀEøÿý,®7Xÿ÷ FÅHÿ}¾ÆÎÖ ÷ B, ÷ rî,Ô(÷ 0ÿ%Åàÿw@ä&ÿ÷ÿÿ"ÿ÷ÿÿ÷Mÿÿ÷M¦,úÿÿ÷]ÿ ÿõÿDÅeè ÀªªÅàÿ5@äÅe1, ûØ÷ ÅÖþ}4<FLL÷6êúþ‡,F· ôþ‡÷ b‡· ðþÀäþ7êþŦþ}fv|‚…,lˆŽ˜°TE .WORD FCTN6 ; SEARCH MIN.-ALLOC-SWAB-DEALLO .WORD FCTN7 ; MIN SEARCH,ALL,NEW SB/NOB,DEALL. FCTN0 = . JSR PC,SRCH ; SEARCH BR RSTART FCTN1 = . JSR PC,MSRCH ; MINIMUM SEARCH BR RSTART FCTN2 = . JSR PC,ALLO ; ALLOCATE BR RSTART FCTN3 = . JSR PC,DALLO ; DEALLOCATE BR RSTART FCTN4 = ±P)+,R1 ;RESTORE RTS R5 ;EXIT ; INPUT A POSITIVE OR NEGATIVE OCTAL NUMBER FROM TTY; ; A CR IS EXPECTED AS A DELIMITER AFTER THE LAST DIGIT ; ; CALLING SEQUENCE -- ; ; JSR R5,INN ; .BYTE 0 -1,0,1 ON RETURN IF NEG, ERROR, POS ; .BYTE 0 NO OF DIGITS READ ; NUMBER RETURNED IN R4, 2'S COMP IF NEG ; INN: CLR (R5)+ MOV R3,-(SP) CLR R3 INN010: JSR PC,ICH ³´Ð÷ :÷ d7÷ À4÷ ‚1÷ ´},’÷ x,÷ â÷5rÎ&ÀjÎ÷ šÀ÷ \÷ ,ù,¸÷5VÎÀNÎ÷ ~À÷ @÷ ÷5:Î Àä,Þ2Î÷ b÷ DÿÀRþ÷ Åþ}ø     ¼, wRþwPþ÷ È7úÍ÷øÍ÷ ˆ÷5îÍx÷ ‰,*Þý‡7÷÷ j÷ ,m‡÷ �7ÂÍ÷¯,PÀÍ÷ P÷5¶Í\÷ ¦ý‡7Ú÷Ø÷  ,v÷ ôT‡ÀMÀý7ŠÍ÷ˆÍ÷ ÷5~Í@÷vÍr*œžý÷ hý‡7œ÷šæŽ÷U€ˆ÷ ”·´,À€÷ ¨1÷5FÍ÷5t,÷-4Íh*‡ÀM5´ . JSR PC,ALLO ; ALLOCATE JSR PC,DALLO ; DEALLOCATE BR RSTART FCTN5 = . JSR PC,SRCH BIT #1,ALFR ; GET SOMETHING? BNE RSTART ; NO MOV ALAR,R0 JSR PC,ALLO ; ALLOCATE IT SWAB R0 JSR PC,DALLO ; DEALLOCATE THIS BR RSTART FCTN6 = . JSR PC,MSRCH BIT #1,ALFR ; GET SOµ ;GET A CHAR TO R4 CMPB R4,#' ;IGNORE BLANKS BEQ INN010 CMPB R4,#'- ;IS IT A MINUS SIGN '(*) BEQ INN020 ;YES CMPB R4,#CR ;NO, IS IT A CR BEQ INN030 ;YES CMPB R4,#'/ BEQ INN030 ;SLASH COUNTS SAME AS RETURN CMPB R4,#60 ;IS IT A VALID OCTAL DIGIT BLT INN060 ;NO CMPB R4,#67 ;MAYBE BGT INN060 ;NO ASL R3 ¶"ú Ô¥ 0© ”Ø…HÀþ? "*ÀÀ ÀÀ· :âÆæ 7 Ìþ7 ôþ @÷ ìþÁe ùá w°þ÷E@Hýw øõw òÜw ìø÷ ÚÀ ÷ Žþöww ÐñÀEøÿ7†þ÷‚þ7 vþw ¾÷ ¬ Y Nõ· \þw ¤ ÷ ’ 7 9õ÷5¸òw †0÷2þ7 *þ÷ þ÷@þ=÷5�òw ^07 þw·,æZý7$Í÷0"Í÷ ²÷5Í ÷Í8ý÷ ý‡˜, 76÷04ÌÀ€À ÀÀÀ,2ÀÀU@· ýžü}JVVd^fVÖ …,XwôýÖ wîý‡÷ÞüÒü‡ÅàÿwD”ü÷ÿÿ�ü ,~÷ŠüŒü÷M†ü†ü÷M~ü~ü÷]|üxüõ-tü@äÅeçˆ,¤ ‡Å”üÅ þ‡Àˆü€ `@`Á Á Á Á Á º,ÊÁ Á Á Á @`7fü‡Á‹ ‡ BЊÁA Áe!,ðB †Š@ЇÁÅàÿÑ>Ñ<Ñ:ÑþËÑhüËQ@äÅeû‡±,$—,¸METHING? BNE RSTART ; NO MOV ALAR,R0 JSR PC,ALLO ; ALLOCATE IT SWAB R0 JSR PC,DALLO ; DEALLOCATE THIS BR RSTART ; FCTN7 = . JSR PC,MSRCH BIT #1,ALFR ; GOT SOMETHING BNE RSTART MOV ALAR,R0 ; YES JSR PC,ALLO JSR PC,GETSB MOV SBNOB,R0 JSR PC,DALLO ; RSTART = ¹ ;YES, MOVE DIGIT INTO NUMBER ASL R3 BCS INN060 ;GT 177777? ASL R3 BCS INN060 ;GT 177777? BICB #370,R4 ADD R4,R3 INCB -1(R5) ;INCREMENT DIGIT CNT BR INN010 ;GET NEXT DIGIT INN020: MOVB #-1,-2(R5) ;SET FLAG TO NEG NUMBER BR INN010 ;GET NEXT DIGIT INN030: CMPB -1(R5),#6 ;EXCEED 6 DIGITS? BGT INN060 ;YES, ERROR MOV R3,Rº RH÷ @ EÁ Oò wæýw 0X÷  HÁ  Lò w¶ýw j÷ ü YÁ@ Nò w’ýÁ�ýÁeÁm–ýÁmœýÁm~ýwxýw Ô¶w Ú÷‹e÷‹p÷‹kw ¸¨w ªúÀEÿ7Fýw ¤„w –úÀEøÿ7>ý w Ššw |ú7$ý· *ý÷U@ÀûĨ÷*"ý•7ýÀ‹!w 87 @Ä 1 ä� � W ÷Á Á @ìäÀ @lðÈ 7 ÷5€vûß÷ Òü×÷5@fûÎw þ7 TûÀRû÷,ñw úÊwòý÷ ôÀ W /3¨Ã*ŠÃ ý÷ Ö *w ÈÆ÷7B0�¨@ ,ï - ÷ ® *ìÂ"€ ð‚²�¨‚ ú w ŠõØ /Ú…»Jÿÿ÷5 òÿ ÷¥æÿ7 æÿ÷ÿÿâÿ÷EðV,p”÷U0Ž÷EÿŒ÷U†÷E ¾ÿï÷Eðr÷U,–Pl÷Eÿj÷U„d ÷EðX÷U@R÷EÿP÷UJ,¼„Jw ðÀ~ÿ7 xÿ7Ðtÿ÷lÿŠÀ   J,âD$ € „  ‚ Â5øq$Ñ W 9îÄ5ú,÷5 8ÿà ÷ (ÿ ÷ ,ÿ†÷&ÿ÷ ÿÿ�,.÷Eÿ Ú÷5 ÿ'ƒ ÷ þþÒƒÂíöþ‚ ÂÂÝ8,Tîþ·îþ÷Eêþ„  ƒ Ã5úq$w L‡÷5 ,zÎþ÷UÆþõ÷ Äþù�ñƒ ÷ °þ«ª·´þÂí¤þ» ‚ ÂÂÝœþ· þ þ�'´¼ . MOV FLD2,R5 ; GET RESTART PROCEDURE JMP @RST(R5) ; DO IT RST = . .WORD RST0 ; SINGLE CYCLE .WORD RST1 ; LOOP .WORD RST1 ; LOOP .WORD RST1 ; LOOP .WORD RST1 ; ON RESTART SAME AS OTHER LOOPS .WORD RST1 ; LOOP RST0 = . CLR R0 ; NO ERROR JMP CALDG1 ; START AGAI½4 ;NO TSTB -2(R5) ;IS NUMBER NEG. BEQ INN050 ;NOT NEG NEG R4 ;YES, TWO'S COMP NUMBER INN040: MOV (SP)+,R3 ;RESTORE R3 RTS R5 ;EXIT W/RESULT IN R4 INN050: MOVB #1,-2(R5) ;SET FLAG TO POS NUMBER BR INN040 INN060: CLRB -2(R5) ;SET FLAG TO ERROR BR INN040 .PAGE ;******* SYSTEM SUBPROGRAM TO PRINT WRITE AND READ CRCC'S********* CRCPRT: JSR PC,CRLF ¾**DATUM MAG. TAPE DIAG.** !UNIT NUMBER !PHASE-ENCODED (Y OR N) !# TRACKS (7,9) !WRONG # TRACKS SENSED !PARITY (E,O) !DENSITY (H , L) !CORE DUMP MODE (Y , N) !DATA PATTERN (0-7) !DATA VALUE !BYTE COUNT !SELECT TESTS: !??!TEST TERMINATED !_H^v”´¶à‡÷8ïÀ¦ú7 �7 NÀU€ÀEÁRõ÷ ~ÀŠúÀEÀU¾÷ n‡ 7 d÷ ÁTõ÷ X‡ 7 N÷ ÁVõ÷ B‡Àÿ÷ÿ27 ðÿÁXõ÷ ( ÷ "‡À\÷ÿ�7 ÒÿÁZõ÷ ÷ ‡7 T÷ L÷5¶ø÷ �@w 8þÀ‚w .öw D¿&æ¦f&MDÀÖ €�‚ƒ„…¹øÀN AT FRIST HALT RST1 = . JMP CALDG2 ; START FROM SWR PICKUP ; ; ; NOTE: R0 HAS SB/NOB FOR REQUEST ; DALLO = . JSR PC,WRAP ; CHECK FOR WRAP AROUND MOV R0,ALRR MOV #4,ALFR ; START DEALLOCATION JSR PC,TIMOUT ; TIME OUT APPRPRPIATELY BIT #2,ALFR ; MAKE IT IN TIME? BNE TIMERR ; NO TST FLD5 ; SOFTWARE TOO? Á MOV WRITAD,R0 JSR PC,CRCCHK JSR PC,FORMAT MOV READAD,R0 JSR PC,CRCCHK JMP DIALOG ;********** ROUTINE TO CALCULATE CRCC FROM WRITE AND READ BUFFERS... ; ...AND PRINT EACH OUT IN BINARY: [7 6 5 4 3 2 1 0 P] CRCCHK: MOV XCOUNT,R1 ;WORDS ASL R1 ;BYTES CLR R2 ;CRCC CRC100: MOVB (R0)+,R3 ;WORK REG MOV R3,-(SP) ;Âì÷ Œ7 &‡ADDR ERR XXXXXX ZZZZZZ !7 7 H÷èDÃ^7 >÷ RÿÀ € BÂM€ÿ · ×-“3· ÷ æ7 º‡\\\\\7 –Á^@w ˆ¢@w ~ªw ”ž÷ Æÿñ7 t‡ XXXXXX ****** !‡ 7Dù7œí÷ <ùw :„ 70ù7Ší÷ (ùw &‡÷ ôø÷ ðø À ÷ \íw 7 Tíw À õ‡UtÀÒD F š Ú Ü & N Ú w * ÷ xì€w $„ ÷E@hìw „ ÷ÿÿ^ìÁÊ÷ÁewPìw úwHìw ú÷ @ìw ì÷ 2ìw à„ w Þw Ò ÷ ì€w Ì÷ ì€w À‡w ¶ Àv÷ÀE7üë÷5ôëw ¢„ ÷ÿÿêëÁV÷ÁewÜë÷ Øë÷5Ðëw ~„Ä BNE DALL1 ; YES RTS PC ; NO DALL1: MOV R0,B3RR MOV #4,B3FR JSR PC,DALLOC JSR PC,SOFTCP ; COMPARE SOFTWARE TABLE BNE HDER1 RTS PC ; ALLO = . JSR PC,WRAP ; CHECK FOR WRAP AROUND MOV R0,ALRR MOV #10,ALFR ; START ALLOCATION JSR PC,TIMOUT ; TIME OUT APPROPRIATELY BIT #2,ALFR ; ÅALSO WORK MOV #8.,R4 CLR R5 ;PARITY CRC110: ASR (SP) ;SHIFT OFF NTH BIT ADC R5 ;ACCUM SET BIT COUNT DEC R4 BNE CRC110 SWAB R3 CLRB R3 TST (SP)+ INC R5 ;MAKE PARITY ODD ASR R5 ;SHIFT PARITY TO CARRY ADCB R3 SWAB R3 ;PARITY BIT NOW IN BIT #8 JSR PC,EOR ;Æ w |÷5¾ëw l‡ÄÂ>÷ÂÀ÷ÀEÀU7žëÀ À ÷5@’ë„ w <„ w 2ÀåÄ ë‡w ÷5jëw „ Âw *  üÁÆöÁewLë÷5Dëw ò w  „ ÷52ëw à ‡w ö w Ú ÷5 ëw Ê „ w à ÷5 ëw ¸ ‡w Î ÷höw ¼ ÷5@îêw œ „ ÷Pöw ´ ÁUwÖêw ´ ÷5@Êêw x ÷ Âêw n „ ÷"öw v w Z ÷5@¤êw R ÷ œê€w H w T „ ÷5@ˆêw 6 ÷ €êw , ‡÷ìõ÷0Úõw & w . ÷Ìõw ÷(Âõw & ÁUwHêw & ÷5<êw ê w â „ ÷5*êw Ø ‡IDÀ Ð Æ  j N´ü7 øô÷æôw 2 æûÿw 6 Ž üÖ ÷Îôw " æûÿ÷Àôw  w ü ÈMAKE IT IN TIME? BNE TIMERR ; NO TST FLD5 ; SOFTWARE TOO? BNE ALL1 ; YES RTS PC ; NO ALL1: MOV R0,B3RR MOV #10,B3FR JSR PC,ALLOC JSR PC,SOFTCP ; COMPARE SOFTWARE TABLE BNE HDER2 RTS PC ; SRCH = . BIC SMASK,R0 ; MASK OUT BAD SEARCH ADRESSES MOV R0,ALRR MOV #20,ALFR ÉEOR NEW DATA WORD INTO CRC CLR R4 MOV R2,R3 ;NEW CRCC SWAB R3 ASRB R3 ;P TO C FOR FOLLOWING SHIFT TO BIT #0 ROLB R2 ;THIS IS THE CRC SHIFT (P TO 0, ETC.) ADC R4 ;SAVE NEW PARITY BIT BEQ CRC120 ;NOT SET: BYPASS SELECTIVE INVERSIONS MOV #74,R3 JSR PC,EOR ;INVERT BITS 2,3,4 & 5 IN NEW CRCC CRC120: SWAB R2 ;PRÊw  Ž øÖ · ¶ô×-²ôÞ‡÷¦ô÷žô÷(Žôw Ú w â · Œô×-ˆô ö÷tôw È ÷(jô÷nôw ° w   w ¬ ÷Rôw ¢ ÷(Hôw ˆ ÷Hôw Š w Š ÷0ôw „ ÷(&ôw f ÷&ôw h w h ÷ôw b ÷(ôw D w P ‡ ·ô·œ îów : w B ‚ — ó÷Øów ,  ·Úó·œ Èów  w  w w ‚ — ï‡:  ÷®ó÷œów è w ð÷eŽó×-ŠóÀõ÷]€ów Ô÷vów  w Æ w ®w º ÷e`ó×-\óÀñ‡Á÷Xó÷(Fów ’ æó÷ ó7 –÷Äç÷Øÿ¼çÀ(óÀUÀU@7ªçw \ ÷ r÷5Àñw f $Á â÷öòw JÁ7 Lw > ÷vç÷ØÿnçÀÚòÀUÀU@7\çw  ÷ $÷5rñÌ; START SEARCH JSR PC,TIMOUT ; TIME OUT APPROPRIATELY BIT #2,ALFR ; MAKE IT IN TIME? BNE TIMERR ; NO MOV ALAR,LALAR ; SAVE AR TST FLD5 ; SOFTWARE TOO? BNE SRCH1 ; YES RTS PC ; NO ; ALL SEACHES END UP HERE SRCH1: MOV R0,B3RR MOV #20,B3FR SRCH2: MOV BITTBL+30.,-(SP) ; SAVE OLD SOFTWARE LAST WORD BIS #100000,ÍESERVE LOW 8 BITS CLRB R2 ;PREPARE FOR PARITY BIT ADD R4,R2 ;PUT 0 OR 1 FOR PARITY SWAB R2 ;***NEW CRCC WITH PARITY AND INVERSIONS* DEC R1 ;ANY MORE DATA BYTES? BNE CRC100 ;YES MOV #753,R3 ;NO: PREPARE TO DO FINAL INVERSION JSR PC,EOR ;INVERT ALL FINAL BITS BUT #2 & 4 ;******* NOW PRINT THE COMPUTED CRCC IN BINARY***** MOV #9.Îw  :w  Á Þ·zò‡· T26- NO WRITE INT. !T26- NO READ INT. !÷|òxò÷jòfòw ² æÁÿw ¶Ž üÖ ÷?Nòw ¢æÁÿw š ÷@ò<òw |w ˆ Ž õÖ ‡÷¼æ÷Âÿ´æÁ òPw¨æ÷5€¢æü‡÷ò÷>òw L ÀÂ÷ Äÿ ü÷æñw :ÀÂw . ÷fæ÷ ¦ÿw   õ‡ôRÀÐèèèèèš÷ ñ ÷@~å÷ 7 vå÷ ‡Å¦Ä°÷ûÿz÷ x÷5vï2÷ Òð÷5@Jå ×-\ÿÿ ÷ ¨ðÃà Ã�Ð ÷5@"å�“ÃEÿÂåÂEÿƒ �w ÄÞÁw ¼Ìw ¾ ºÔ · ćwÞäÕ ÷þÿÔäÁ@ðÁUwÆäw ¤÷*ðw ~÷ ðw `‡ÝÝ··MMG‰uuììÿÿ€ÐBITTBL+30. ; FORCE LIKE HARDWARE FOR SRCH. JSR PC,SEARCH MOV (SP)+,BITTBL+30. JSR PC,SOFTCP ; COMPAR WITH SOFTWARE TABLE BNE HDER3 BIT #1,ALFR ; FIND AREA? BEQ SRCH3 ; YES BIT #1,B3FR BEQ HDER4 BR SRCH4 SRCH3: CMP ALAR,B3AR ; SAME AREA? BNE HDER5 SRCH4: RTS PC ; OK ; MSRCH = . BIC SMASÑ,R5 MOV #CRCBUF,R4 CRC130: MOVB #60,(R4)+ ;INIT PRINT BUFFER TO ALL ZEROS DEC R5 BNE CRC130 SWAB R2 ;PARITY FIRST ASRB R2 ADCB -(R4) SWAB R2 MOV #8.,R5 CRC150: ASRB R2 ADCB -(R4) DEC R5 BNE CRC150 JSR R5,ONCH ;PRINT THE NINE BITS .WORD CRCMSG .WORD CRBFLN RTS PC EOR: ;SUÒ€ô:CRC-LPC ERR; EXP ** *** ***, REC. ** *** *** !÷Úï÷?Èïw ÷¾ïw ‡÷ ÌïE÷ Úÿ÷Áÿ<ä÷8äÀ¢ïÀU7(ä÷U *ä÷5äw Æ„ ÷5 äw ¸„ ÷ šÿ÷?hïw ¨÷5îãw œ„ ÷5êãw Ž„ ÷‹Þã×­Øã w z„ ÷5¾ãw l‡w † è÷$ï÷þïw ^w vÁUw”ãw r÷5ˆã÷ïw d7 ïìw F üw $‡RDY FOR EOT TEST !END- EOT TEST !FBÀÒ\ „@@B´@w Nw BÁnâÁEûÁE€w w ,8w „ ÷5Hâw ö‡PLSE REMOVE WRITE RING, THEN RESTART !KINDLY INSERT W.R., THEN RESTART ÔK,R0 ; MASK OUT BAD SEARCH ADRESSES MOV R0,ALRR MOV #60,ALFR ; START MIN SEARCH JSR PC,TIMOUT ; TIME OUT APPROPRIATELY BIT #2,ALFR ; MAKE IT IN TIME? BNE TIMERR ; NO MOV ALAR,LALAR TST FLD5 ; SOFTWARE TOO? BNE MSRCH1 ; YES RTS PC ; NO MSRCH1: MOV R0,B3RR MOV #60,B3FR BR SRCH2 ; TIÕBROUTINE TO EOR R3 INTO R2 MOV R3,R5 BIC R2,R5 BIC R3,R2 BIS R5,R2 RTS PC CRCMSG: .ASCII "CRCC = " CRCBUF: .BYTE 0,0,0,0,0,0,0,0,0 CRBFLN = .-CRCMSG .PAGE COMAND:.WORD 0 CURUNT:.WORD 0 EOFCOM:.WORD 4 ;END-OF-FILE BIT ERRPAT:.WORD 0 EXCOM: .WORD 0 NFILES:.WORD 0 NRECS: .WORD 0 OFFSET:.WORD 0 READAD: .WORD READBF ;CURRENT READ BUFFER BEGIN ADDR STAT: .WORD 0 UNITNO:.WORÖ !÷ xí?÷ tí<÷Xít÷EPí÷ l÷5Òáw €„ ÷U8í÷ T÷5ºáw h„ ÷E íw t÷íw f÷U í÷?íw fÁUwˆáw f÷5|áw *÷äì‡÷âì÷?Ðìw (÷Æìw ÷?¼ìw ü‡   ÷‹`ëý€·\ëw ÷5€6áú€ w ÷5€(áú€ ñ÷‹8뀷4ë� W …… €> À]‡÷5ëw  |w ¶r…TIMER ERR XXXXXX !w xÀ8ìÀE7¾à÷5€¸àw d„ ÷5¨àw V„ ÷5šàw H„ ÷ÿ�à÷ŒàÁöëÁUw|à÷5€vàü÷5làw „ ÷5^àw ÷5€Tàü„ ÷5Hàw ö„ ÷5:àw è÷5.àü„ ÷5€&àw Ò„ ÷5àw ć÷ˆë„ë÷vërëw ¾w ²w ØMERR = . MOV #100000,R0 ; SET TIME OUT ERROR BIT BR ERROR ; HDER1: MOV #1,R0 BR HDERR HDER2: MOV #2,R0 BR HDERR HDER3: MOV #3,R0 BR HDERR HDER4: MOV #4,R0 BR HDERR HDER5: MOV #5,R0 HDERR: BIS #40000,R0 ERROR = . INC NERROR MOV FLD2,R5 JMP @ERR(R5) ERR = . .WORD ERR0 ; SINGLE CYCLEÙD 0 WRITAD: .WORD WRITBF ;CURRENT WRITE BUFFER BEGIN XCOUNT:.WORD 0 XRECS: .WORD 0 CHRFG: .BYTE 0 EXSWCH:.BYTE 0 MCODE: .BYTE 0 MINTFG:.BYTE 0 PPOS: .BYTE 0 REQFLG:.BYTE 0 TTYTMP:.BYTE 0 WRTCTR:.BYTE 0 XFILES:.BYTE 0 $COLON:.BYTE 0 .END ÚÒÁUwðßw Î÷5äß÷5€Üß÷5€Öß æ>ë÷8ëw Œ·0ëw �ì÷Fëw ˜7 >ëØw vw rw V‡÷ëë÷ëëw Lw @w Lw XÁUwzßw X÷5nß ÷5@fßw Hw éw ‡¬³w8wFwXw^wlwŽw”w¢wÚwèwöwúwüw ww ðÿÁEÁUwß…w ÖÿÁUwøÞw Öÿw Öÿ…w ÈÿÁUw ¾ÿÁUwØÞw ¶ÿ…w ¤ÿÁUwÆÞw ¤ÿÁ¼ÞÁ5@÷U€²Þw ”ÿ…w ~ÿÁUw tÿÁU w–Þw tÿ…÷êw `ÿÁUw~Þw \ÿ÷5rÞ æÜé÷Öéw *ÿ·Îéw @ÿ7 æé…w *ÿÁUwHÞw &ÿ…w ÿÁU w6Þw ÿÛ÷.Þƒ÷&ÞÁŒé wÞ7 ÞÁ‚é…÷5ÞüÜ-TRY AGAIN .WORD ERR0 ; LOOP BUT HALT ON ERROR, THEN RETRY. .WORD ERR2 ; IGNORE .WORD ERR1 ; LOOP RETRY FUNCTION WITHOUT HALTING .WORD ERR3 ; RESET SB/NOB IF ERROR .WORD ERR0 ; SAME AS 1 ERR0 = . TST (SP)+ ; POP OFF RETURN PC HALT JMP FCTN ; RETRY FUNCTION ERR1 = . TST (SP)+ ; POP OFF RETURN PÞ…7 º÷5 èÁôÝ€Àzéw ¤7.ÀàÝ÷ né÷5üçÁEw ~¤w ”˜7 z…T **, S.E. STATUS !!Xw wFw¦wèwwDwàwøw&÷5Lçw Úÿ7w ê@€… TEST ** !&f¦÷5çÀw ªÿ72w  ÿ7,ÀÜÜw �ÿ ÀÔÜw †ÿ¨w œ’‚�€…ERR: XX YY STATUS COMMND !7 VD@ @ @ @ @ ÀEðÿw @ÿ@€ € € € € € ÀEÀÿw (ÿ@ÀEÀÿw ÿ7 …fÀE8Àe0� � � Áe0À@`�…7 òÃÄžçÀ¦ç ÁšçœV S�Ä ý7ŠS�AŒÄ ü7 ¼…ÿU»ÿ7 ¬fÁ`ç ÄÅPç… ÃEÀÀÔÅ úÃÄÅ6çÂûàC JMP FCTN ; RETRY FUNCTION ERR2 = . RTS PC ; INGORE ERR3 = . MOV OSBNOB,SBNOB ; RESTORE SB/NOB FOR RETRY. RTS PC ; SOFTCP = . MOV #-32.,R5 SOFC1: MOV BITTBL+32.(R5),A MOV #-1.,B MOV A,C BIC B,C BIC A,B BIS C,B ; PERFORM EXCLUSIVE OR CMP B,ALLTBL+32.(R5) ; SAME AS HARDWARE âÿ÷5äåW!ÃUÄUÌ¢ “w nþÞÁ’w fþîw hÒ‚ ƒ „ Å â…7 @…D.E.: O= ** *** *** I= ** *** *** !7 ÀÁ€ÿP‚ ý7 ú…7 ðÁDÂþÿw øýÂýÿw ðýÂýÿw èý7 Ô…Ã0A †ƒ Ô�‚ ø„ …V<w(w2w@wNwTw\wxw�w¶wÂwè&Àü€ þ€…fÁìÿw ¼ÿ� ü�…&À w ®ÿÀ ü€…æ¦f&LÖ €�‚ƒ„· øã÷‹ôãý€÷‹òãý€÷�êãìãÀäãÀE€ÿ‡7 ÷ xÿÀ% 7øÀ‡f ÷ \ÿÀ% w ^ÿÀEøÿÁ Á Á `ñÕ @�… 0 7Õ …w 7 ÿA@” !÷‹rãý€7�nãö7 ÿ… ! ÷ úþw ÿÀEðÿÁ Á Á ä BNE SOFC2 ADD #2,R5 BLT SOFC1 ; NOT DONE YET CLR R5 ; OK-SET C.C = 0 SOFC2: RTS PC ; ; ; NOTE: DELAY = 2 FOR 23 USEC-11/20 ; ; JSR PC,TIMOUT 7.0 ; MOV DELAY,R5 5.0 ; DEC R5 2.3 ; BNE .-2 2.6 OR 1.7 ; RTS PC 3.5 ; TOTALS 24.4 FOR DELAY = 2 ; TIMOUT = . MOV DELAY,R5 X: `ô&@�‡Å÷è DEC R5 BNE X RTS PC ; ; ; SBNOB CONTAINS OLD NUMBER ON ENTRY ; NEW RANDOM NUMBER ON EXIT ; ; USES (2**9+3)RN AS ALGORITHM ; USES R0 AND R1 ; RANDOM = . MOV SBNOB,R0 BNE RAND01 INC R0 ; MAKE SURE DON'T START ON ZERO RAND01: MOV R0,R1 ADD R0,R0 ADD R1,R0 ; TIMES THREE ASL R1 ASL R1 ì ASL R1 ASL R1 ASL R1 ASL R1 ASL R1 ASL R1 ASL R1 ADD R1,R0 MOV R0,SBNOB ; NEW NUMBER RTS PC ; WRAP = . ; MOV R0,R1 ; R0 HAS THE SO/NOB ON ENTRY TSTB R1 ; NOB = 0 BNE WRAP2 ; NO CLR R0 ; YES - FORCE SB TO BE ZERO ALSO. RTS PC ð ; RETURN TO CALLER. WRAP2: CLR R2 ; CLEAR R2 FOR BISB BISB R1,R2 ; PUT NOB INTO R2 CLRB R1 ; CLEAR NOB IN R1 SWAB R1 ; PUT SB INTO LOW BYTE COM R1 ; GET NEG VALUE OF SB ADD #256.,R1 ; FIND OUT HOW MUCH ROOM LEFT. CMPB R1,R2 ; HAVE WE ASKED FOR TO MUCH. BHIS WRAP3 ; NO - GO HOME. CLRB R0 ; YES - ôRESET TO MAX AVAILABLE IN R0 BISB R1,R0 ; WRAP3: RTS PC ; ; SAVE = . ; SAVE OLD INFO MOV #PRESTR,R1 MOV #-32.,R5 MOV B3RR,(R1)+ MOV B3AR,(R1)+ MOV B3FR,(R1)+ MOV ALAR,(R1)+ MOV ALFR,(R1)+ SAV1: MOV ALLTBL+32.(R5),(R1)+ ADD #2,R5 BLT SAV1 RTS PC .END ø