32SEP73004859\.t:#z32SEP73004901. xQz32SEP73004901|. kz32SEP73004902M9.PNNz32SEP73004903@.*O:z32SEP73004904o.  32SEP7301021332SEP73010059Y ;CLOSES ALL FILES UPON EXIT. ;REVISION A ;DATE 4/26/73 ;CHANGE REQUIRED ENTRY TO JSR PC, BEGIN. ;CHANGE EXIT TO RTS PC. ;ADD TO GLOBL TABLE SUBROUTINE "PAGE". ;ADD TO PROGRAM SUBROUTINE "PAGE" ;ADD TO BEGIN/PRINT THE JSR PC, PAGE. .REG .TITLE BEGIN .GLOBL BEGIN,DIALOG,FILE2,FILE3,LINK1 .GLOBL LINK2,LINK3,READ2,READ3,SEARCH .GLOBL FILE1,START,SPOINT,SBYTES .GLOBL POINT2,GET,POINT1 .GLOBL BUFF1,WRITE1,POINT3 .GLOBL SRTABL,SPACES,ASCII,BUFF3,BUFF2 .GLOBL PAGSP) CMP R4,(R5)+ BNE ERR INC R4 DEC (SP) BNE .-10 TST (SP)+ COM (R1)+ ;FLAG BEQ RD1 INC D1 MOV #BUF1,R5 MOV D1,R4 MOV #4096.,-(SP) MOV R4,(R5)+ INC R4 DEC (SP) BNE .-6 TST (SP)+ MOV #103,-(R0) ;WRITE. BR EXIT1 RD1: MOV #105,-(R0) EXIT1: MOV (SP)+,R5 MOV (SP)+,R4 RTI SERV2: MOV R4,-(SP) MOV R5,-(SP) MOV #165330,R2 TST -10(R2) BMI ERR BIS #400,-10(R2) MOV #HDR2,R3 MOV (R3)+,(R2) MOV (R3)+,-(R2) MOV (R3)+,-(R2) MOV (R3)+,-(R2) MOV #BUF2,R ;GET A. GET2: DEC R1   ;DEC BYTE COUNT. BNE .+6 JSR PC, NEXTG BR GET1 GETA: DEC R1 BNE GETB JSR PC,NEXTG CMPB (R0),#'A  ;1ST CHAR OF BUF "A"? BNE GETB  ;GETB IF NO. INC GET-6  ;INC 1ST LINE CNT. GETB: CMPB R3,(R0)  ;A/CHAR. OF INTEREST. BEQ GOT CMPB #'A,(R0)  ;OVERFLOW CHECK ON LINE BUFFER. BEQ ERREX  ;IF EQUAL SEND BAKE XXXX. BR GET1   ;KEEP LOOKING. GOT: TSTB (R0)+  ;BUMP DATA BUFFER POINTER. MOV (R4),PC  ;GET2/LOADUP. GETA1: CMP D50 /TEM/ .RAD50 /P/ .RAD50 /2/ .WORD 0 .WORD 0 .WORD 0 .BYTE 0,0 FILE3: .RAD50 /POA/ 0 0 .WORD 0 .WORD 0 BUFF1: .WORD 252. .BYTE 7,0 .WORD 0 POINT1: .WORD BUFFA BUFF2: .WORD 252. .BYTE 7,0 .WORD 0 POINT2: .WORD BUFFB BUFF3: .WORD 2784. .BYTE 7,0 .WORD 0 POINT3: .WORD BUFFC .END E,LINF,SAVE,RESTOR BEGIN: MOV 2(SP),R0  ;GET TABLE LINK. MOV 40(R0),FEEDS ;GET LINE FEED VALUE. ADD #64,R0  ;BUMP TO PRINT TABLE LOC. MOV #SBDABL,B! o o+DABLE HEBE. oMOF #!'.,B" oo o+COENDEB. oMOF (B )+,(B!)+ o o+LOAD DHE DABLE. oDEC R2   ;DECREMENT THE COUNTER. BGT .-4   ;LOOP. BEG1A: .INIT LINK2 .OPENI LINK2,FILE2 JSR R5,READ2 BUFF2 MOV POINT2,SPOINT MOV POINT2-2,SBYTES CLR PAGECN  ;CLR PAGE COUNT. CLR GET-6  ;INIT GET BEGIN1: .INIT LINK15 MOV D2,R4 MOV #4096.,-(SP) CMP R4,(R5)+ BNE ERR INC R4 DEC (SP) BNE .-10 TST (SP)+ COM (R3)+ BEQ RD2 INC D2 MOV #BUF2,R5 MOV D2,R4 MOV #4096.,-(SP) MOV R4,(R5)+ INC R4 DEC (SP) BNE .-6 TST (SP)+ MOV #103,-(R2) BR EXIT2 RD2: MOV #105,-(R2) EXIT2: MOV (SP)+,R5 MOV (SP)+,R4 RTI ERR: HALT 240 240 240 240 BR ERR BUF1: .=.+8192. BUF2: .=.+8192. .END BEGIN R2,(R5)  ;IS IT THE LINE OF INT. BEQ GETDAT  ;GET DATA. INC R2   ;INC LINE # VALUE. BR GET2 GETDAT: INC R2 MOV -(R5),R3  ;LOAD IN DATA OF INT. CMPB #'A,R3  ;IS IT A. BEQ LOADUP  ;IF SO,LOAD UP TST (R4)+  ;NEW OFFSET/LOADUP. BR GET2 LOADUP: DEC R1 BNE .+6 JSR PC, NEXTG TSTB (R0)+  ;);DON'T NEED IT. CLR R5 MOV #DATA+2,R3 LOAD1: DEC R1 BNE .+6 JSR PC,NEXTG CMPB #'(,(R0) BEQ EXIT MOVB (R0)+,(R3)+ INC R5 CMP #30.,R5  ;CHECK FO  ;INIT ,FORM FEED MOV 200,-(SP) ADD #120,(SP) MOV #211,@(SP)+ .OPENO LINK1,FILE1 MOV #POINT1-2,R0 ;WRITE 2 FORM FEEDS TO PRINTER. MOV #2,(R0)+  ;BYTE COUNT. MOV (R0),R0  ;BUFFER ADDRESS. MOV #14,(R0)+  ;FORM FEED. MOV #14,(R0)+  ;ANOTHER FORM FEED. JSR R5,WRITE1  ;WRITE THEM. BUFF1   ;BUFFER #1. CLR R4   ;INIT FLAG FROM SEARCH. BEGIN4: TST R4   ;MESSAGE FROM SEARCH. BNE BDONE  ;NOT ZERO = ALL DONE. JSR PC, DIALOG  ;PAGE HEADERS MOV .TITLE BUFFS .GLOBL BUFFA,BUFFB,BUFFC BUFFA: .=.+252. BUFFB: .=.+504. BUFFC: .=.+2784. .END +Bt:#z xQz kzNNz*O:z,'X,'X,'X DATA: .=.+32. SAVE: MOV R4,-(SP) MOV R3,-(SP) MOV R2,-(SP) MOV R1,-(SP) MOV R0,-(SP) MOV R5,PC RESTOR: TST (SP)+ MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 RTS R5 .END (SP) TST @(SP)+ BEQ RSTATR-2 BMI RSTATR-2  ;QUICK FIX. JSR R5,SAVE MOV 12(SP),R5 MOV -(R5),R5 TST (R5)+ CMPB (R5),#7 BNE RSTAT1 TST (R5)+ MOV (R5)+,R4 ADD (R5),R4 RSTAT2: TSTB -(R4) BEQ RSTAT2 TSTB (R4)+ SUB (R5),R4 MOV R4,-(R5) BLE RSTAT3  ;TEST FOR ZERO. RSTAT1: JSR R5,RESTOR SEZ BR RSTATR RSTAT3: JSR R5,RESTOR CLZ RSTATR: RTS R5 WRITE1: .WRITE LINK1,@(R5)+ .WAIT LINK1 RTS R5 WRITE2: .WRITE LINK2,@(R5)+ .WAIT LINK2 !ED LINE FEEDS. FEEDS: 0   ;VALUE FOR # OF FEEDS. BIC #177760,R2  ;LIMIT TO 20. TST R2   ;TST FOR ZERO. BEQ LINF2  ;RETURN IF ZERO. SUB R2,R3  ;TST FOR LINE FEED OVERFLOW. BEQ .+4 BPL LINF1  ;PLUS = NOT OVERFLOWED. JSR R5,RESTOR  ;RESTORE REGISTERS;ALT RETURN CMP (SP)+,(SP)+  ;CLR STACK OF UNWANTED RETURN ADDRESSES. BR BEGIN3  ;GO THE ROUTE OF FORM FEED. LINF1: MOVB #12,(R0)+  ;MOVE LINE FEED CHAR. TO BUFFER. INC R1   ;INC BYDE COEND. oDEC B" o o .BYTE 1,0 .RAD50 /DF/ .WORD 0 .BYTE 0,0 FILEX: .RAD50 /LIS/ .RAD50 /TER/ .RAD50 /OVL/ .BYTE 1,1 .WORD 0 BUFFX: .WORD OVL-17000 .BYTE 7,0 .WORD OVL-17000 .WORD 17000 .END OVL # .TITLE OVL .REG OVL: .INIT LINKX .LOOK LINKX,FILEX TST (SP)+ TSTB (SP)+ BPL OVL1 .DELETE LINKX,FILEX OVL1: .OPENO LINKX,FILEX .WRITE LINKX,BUFFX .WAIT LINKX .CLOSE LINKX .RLSE LINKX EMT 60 .WRTS R5 WRITE4: .WRITE LINK4,@(R5)+ .WAIT LINK4 RTS R5 .END % o+DEC BEABIBED BIDE COEND. oBNE LINF! o o+LOO@ DIL JEBO. oMOF B#,LINEC o o+E@DADE LINE COEND. oMOF B!,@OIND!-" o o+LOAD E@ BIDE COEND. o.GAID LINK! oJCB B%,GBIDE! o o+GBIDE OED DHE BEFFEB. oBEFF! LINF"* oJCB B%,BECDOB o o+BECDOBE DHE BEGICDEBC. oBDC @C o o o+NOBMAL BEDEBN DO CALLEB. @AGE* oJCB B%,CAFE o o+CAFE BEGICDEBC. oMOF #CBDABL,B! o o+GED DHE COBD DABLE ADDBECC. oCLB B" o o o+INID B". @AGE!* oMOF #C@ACEC,B o o+GED DHE C@ACE DABLE. oCM@B (B!),(B )+ o o+LOOK FOB ONE OF IND& .TITLE LINKS .GLOBL LINK1,LINK2,LINK3,FILE1,FILE2,FILE3 .GLOBL BUFF1,BUFF2,BUFF3,POINT1,POINT2,POINT3 .GLOBL BUFFA,BUFFB,BUFFC .WORD 0 LINK1: .WORD 0 .RAD50 /DS4/ .BYTE 1,0 .RAD50 /LP/ .WORD 0 LINK2: .WORD 0 .RAD50 /DS5/ .BYTE 1,0 .RADORD 0 LINKX: .WORD 0 .RAD50 /CAT/ .BYTE 1,0 .RAD50 /DF/ .WORD 0 .BYTE 0,0 FILEX: .RAD50 /TRN/ .RAD50 /GEN/ .RAD50 /OVL/ .BYTE 1,1 .WORD 0 BUFFX: .WORD OVL-17000 .BYTE 7,0 .WORD OVL-17000 .WORD 17000 .END OVL ( .REG .TITLE EXEC  ENTRY: .INIT KBLINK  ;INITIALIZE TTY KEYBOARD .INIT PTLINK  ;INITIALIZE TTY PRINTER .OPENI KBLINK,KBFILE ;OPEN FOR INPUT .OPENO PTLINK,PTFILE ;OPEN FOR OUTPUT ENTRY1: JSR R5,WTPT  ;PRINT THE FOLLOWING: .BYTE DIA1E-DIA1 ;BYTE COUNT DIA1: .ASCII /SORT11 REV: 5-18-73/ .BYTE 15,12 )EBECD. oBNE .-" o o o+LOO@ DIL FIND. oCLB B# oBICB (B ),B# o o+@ICK E@ BEAEIBED C@ACEC. oADD B#,B" o o+DALLI E@ IN B". oDCD (B!)+ o o+BEM@ COBD DABLE @OINDEB. oDCD (B!) o o+DCD FOB DONE. oBNE @AGE! o o+LOO@ DIL DONE. oACB B" o o o+DIFIDE DALLI BI ". oCEB #$,B" o o+JECDIFI BI FOEB C@ACEC. oMOF @OIND!,B o o+@ICK E@ @BINDEB BEFFEB. oMOF B",B! o o+CDABDING BIDE COEND DO !#&. oMOF #",B# o o+CDILL DGO C@ACEC BEAEIBED. oADD LINEC,B# o o+ADD IN LINE COEND. oADD B#,B! o o+DALLI E@ FO*50 /DF/ .WORD 0 LINK3: .WORD 0 .RAD50 /DS6/ .BYTE 1,0 .RAD50 /DF/ .WORD 0 .BYTE 0,0 FILE1: .RAD50 /TEM/ .RAD50 /P/ .RAD50 /1/ .WORD 0 .WORD 0 .WORD 0 .BYTE 0,0 FILE2: .RAD50 /TEM/ .RAD50 /P/ .RAD50 /2/ .WORD 0 .WORD 0 .WORD 0 .BYTE 0,0 FILE3: .RAD50 /POA/ 0 0 .WORD 0 .WORD 0 BUFF1: .WORD 252. .BYTE 6,0 .WORD 0 POINT1: .WORD BUFFA BUFF2: .WORD 504. .BYTE 7,0 .WORD 0 POINT2: .WORD BUFFB BUFF3: .WORD+ .TITLE OVL .REG OVL: .INIT LINKX .LOOK LINKX,FILEX TST (SP)+ TSTB (SP)+ BPL OVL1 .DELETE LINKX,FILEX OVL1: .OPENO LINKX,FILEX .WRITE LINKX,BUFFX .WAIT LINKX .CLOSE LINKX .RLSE LINKX EMT 60 .WORD 0 LINKX: .WORD 0 .RAD50 /CAT/ .BYTE 1,0 .RAD50 /DF/,.ASCII /COLUMNS:/ .EVEN .WORD 5413 DIA1E: JSR PC, INPUT  ;GET INPUT FROM KEYBOARD JSR R5,CKLDL  ;CHECK AND LOAD LETTERS 13.   ;MAX ENTRIES STABLE   ;ADDRESS OF LOAD BR .+6   ;NORMAL RETURN BR ENTRY1  ;NO ENTRY RETURN BR ENTRY1  ;ERROR RETURN  ENTRY2: JSR R5, WTPT  ;PRINT THE FOLLOWING .BYTE DIA2E-DIA2 ;BYTE COUNT DIA2: .ASCII /LINE FEEDS:/ .EVEN .WORD 5413 DIA2E: JSR PC, INPUT  ;GET INPUT FROM KEYBOARD JSR R5,CKLDN  ;CHECK AND LOAD N-B DODAL BIDEC. @AGE$* oMOFB #!",(B )+ o o+LOAD IN LINE FEED. oDEC B# o o o+DEC BEAUIBED LINE FEED COUNT. BNE @AGE$  ;LOO@ DIL JEBO. DCD B2 o o o;DCD FOB JEBO oBEA @AGE# o o+IF JEBO, NO C@ACEC BEAEIBED. @AGE"* MOFB #$ ,(B )+  +LOAD IN C@ACE CHAB. DEC B" o o o+DEC BEAEIBED. oBNE @AGE" o +LOO@ DIL JEBO. @AGE#* oINC (@C)+ o o+INC @AGE NEMBEB. @AGECN* o o o o+DHE @AGE NEMBEB. o.BIN"D @ADCC,@@AGECN o+BIN DO % CHAB ACCII. oMOF #@AGEBF,B# o o+@ICK E@ DADA BEFFEB. oMOFB (B#)+,B" o o 3036. .BYTE 7,0 .WORD 0 POINT3: .WORD BUFFC .END .WORD 0 .BYTE 0,0 FILEX: .RAD50 /SOR/ .RAD50 /T/ .RAD50 /OVL/ .BYTE 1,1 .WORD 0 BUFFX: .WORD OVL-17000 .BYTE 7,0 .WORD OVL-17000 17000 .END OVL 0UMBER. FEEDS   ;ADDRESS OF LOAD BR .+6 BR SCAN   ;NO ENTRY RETURN BR ENTRY2  ;ERROR RETURN ENTRY3: JSR R5, WTPT  ;PRINT THE FOLLOWING .BYTE DIA3E-DIA3 ;BYTE COUNT DIA3: .ASCII /AT COLUMN:/ .EVEN .WORD 5413 DIA3E: JSR PC, INPUT  ;GET INPUT FROM DEYBOARD JSR R5,CKLDL  ;CHECK AND LOAD LETTERS 4   ;MAX ENTRIES COLUMN   ;ADDRESS OF LOAD BR .+6   ;NORMAL RETURN BR ENTRY3  ;NO ENTRY RETURN BR ENTRY3  ;ERROR RETURN SCAN: MOV #SCANTB,R11+BIDE COEND oADD B",B! o o+DALLI BIDE COEND. @AGE%* oMOFB (B#)+,(B )+ o+LOAD IN @ A G E oDEC B" o o o+DEC BIDE COEND. oBNE @AGE% o o+LOO@ DIL JEBO. oMOFB (B#)+,B" o o+ANODHEB BIDE COEND. oDCDB (B#)+ oDSDB (B#)+ oADD B",B! o o+DALLI BIDE COEND. @AGE&* oMOFB (B#)+,(B )+ o+LOAD IN NEMBEBC oDEC B" o o o+DEC BEAEIBED BIDE COEND. oBNE @AGE& o o+LOO@ DIL JEBO. oMOF B!,@OIND!-" o o+LOAD E@ DHE DODAL BIDE COEND. oJCB B%,GBIDE! o o+GBIDE ID DO DHE LINE @BINDEB. oBEFF! oJCB B%,BECDOB o o+2 .TITLE FAKE .GLOBL BEGIN .GLOBL FORM1,FORM2,SORT,EXTRK,GET  .END 3; .REG RO=%0 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 TKS=177560 TKB=177562 TPS=177564 TPB=177566 SR=177570 LKS=177546 LPS=177514 LPB=177516 PRS=177550 PRB=177552 PPS=177554 PPB=177556 .TITLE EXTRK .GLOBL EXTRK,SOPENI,TEXT,FILE1,LINK1,NOMO .GLOBL POINT3,READ1,BUFF3,SPOINT,SWRT4  ;SCAN TABLE IN R1 SCAN1: MOV #STABLE,R0  ;SORT TABLE IN R0 SCAN2: CMPB (R0),(R1)  ;LOOK FOR SCAN TABLE ENTRY BEQ ENTRY4  ;BRANCH IF FOUND TST (R0)+  ;BUMP SCAN TABLE POINTER BNE SCAN2  ;IF NOT ZERO,REENTER TSTB (R1)+  ;BUMP SCAN TABLE POINTER TSTB (R1)  ;TST FOR ZERO BNE SCAN1  ;CONTINUE IF NOT BR ENTRY5  ;BYPASS OPTION ENTRY4: JSR R5, WTPT  ;PRINT THE FOLLOWING .BYTE DIA4E-DIA4 ;BYTE COUNT DIA4: .ASCII /MONTH OPTION:/ .EVEN .WORD 5413 DIA5BECDOBE BEGICDEBC. oBDC @C o o o+EDEBN DO CALLEB. @AGEBF* o.BIDE & o o o+BIDE COEND. o.ACCII /@AGE/ o.BIDE $ o.BIDE $ o.BIDE $ o o oo+ANODHEB BIDE COEND. @ADCC* o.BIDE , , , , o o+ENOEGH BOOM FOB MONIDOB o.BIDE !" o o+LINE FEED o.EFEN CBDABL* o , , , o0,0,0,0 0,0,0,0 0,0,0,0 0,0,0,0 0,0,0,0 0,0,0,0 0,0,0,0 SPACES: .BYTE 'A,4 .BYTE 'B,16. .BYTE 'C,13. .BYTE 'D,10. .BYTE 'E,13. .BYTE 'F,13. .BYTE 'G,9. .BYTE 'H,9. .BYTE 'I,9. .BYTE7,LINK2 EXTRK: MOV R0,-(SP)  ;SAVE R0 TST (PC)+ SOPENI: 0   ;FILE OPEN FLAG BNE EXTRK1  ;ZERO=NOT OPEN INC SOPENI  ;SET FLAG ; .OPENI LINK1,FILE1 MOV #4,FILE1-2 MOV #FILE1,-(SP) MOV #LINK1,-(SP) EMT 16 JSR PC, INPUT  ;READ TEMP.1 MOV #1,READS  ;SO FAR 1 READ TSTB (R1)+ DEC R2 JSR PC, FAKESR EXTRK1: MOV (PC)+,R1 ADDSS: 0 MOV (PC)+,R2 BYTES: 0 MOV (PC)+,R3  ;TEXT VALUE,NEXT WORD TEXT: 0   ; CMP (PC)+,R3  ;CHECK FOR A CHANGE PF4E: JSR PC, INPUT  ;GET INPUT FROM TTY. JSR R5,CKLDL  ;CHECK AND LOAD LETTERS 11. OPTION   ;ADDRESS OF LOAD BR .+6 BR ENTRY5  ;NO ENTRY RETURN BR ENTRY4  ;ERROR RETURN ENTRY5: JSR R5, WTPT .BYTE DIA5E-DIA5 ;BYTE COUNT DIA5: .ASCII /LIST:/ .EVEN .WORD 5413 DIA5E: JSR PC, INPUT  ;GET INPUT FROM TTY. JSR R5,CKLDL  ;CHECK AND LOAD LETTERS 16.   ;MAX ENTRIES LISTS   ;ADDRESS OF LOAD BR .+6   ;NORMAL RETURN BR ENTRY5  ;NO ENTRY RETURNE 'J,9. .BYTE 'K,9. .BYTE 'L,11. .BIDE 'M,! . ACCII* o'A o o o+ACCII ADDBECC DABLE oDIAL! oDIAL" oDIAL# o'B oDIBL! oDIBL" oDIBL# o'C oDICL! oDICL" oDICL# o'D oDIDL! oDIDL" DIDL# o'E oDIEL! oDIEL" oDIEL# o'F oDIFL! oDIFL" oDIFL# o'G oDIGL! oDIGL" oDIGL# o'H oDIHL! oDIHL" oDIHL# o'I oDIIL! oDIIL" oDIIL# o'J oDIJL! oDIJL" oDIJL# o'K oDIKL! oDIKL" oDIKL# o'L oDILL! oDILL" oDILL# o'M oDIML! oDIML" H ;SAVE. ;ROUTINES TO SAVE AND RESTORE THE REGISTERS. ;ENTER SAVE AND RESTOR BY JSR R5. .REG .TITLE SAVE .GLOBL SAVE,RESTOR SAVE: MOV R4,-(SP)  ;SAVE R4 THRU R0. MOV R3,-(SP)  ;R5 WAS PUT ON THE STACK BY CALL. MOV R2,-(SP)  ; MOV R1,-(SP)  ; MOV R0,-(SP) GTEXT: 0   ; BEQ .+6 JSR PC, SRCH2  ;LOCATE TEXT & UPDATE CMPB #'/,(R1)  ;END OF TEXT? BNE .+6   ; JMP REINIT  ;YES,RESET PARA. MOV #20.,R3  ;BYTE COUNTER,20 EXTRK2: MOVB (R1)+,(R0)+ ;LOAD IN CHARACTER DEC R2   ;DEC BYTE COUNT BNE EXTRK3  ;IS IT ZERO JSR PC, INPUT  ;READ MORE OF TEMP.1 MOV #1,FLNIB  ;FIGURE THAT ONE OUT EXTRK3: DEC R3   ;20 BYTES LOADED? BNE EXTRK2  ; MOV R1,ADDSS  ;UPDATE POINTERS MOV R2,BYTES  ; MOV (SP)+,R0 """"""" "DDDDD@DDDD@@"""""@DDDDDDD"""""" """""""""""@DDDDDDDDDDDDDDDDDDDDDDD """""""" "ADDB CO p:fkM}؁,yvLGywvy:yy FMAX? BLOS .+6  ;.+6 IF NO. MOV R2,FMAX  ;UPDATE FMAX. INC NFLAG  ;SET NFLAG. CLRB (R0)+  ;0 SEPARATOR. FORM1E: JSR PC,FTST2  ;BUFFER FULL? DEC R4   ;END OF INPUT. BEQ FORM1F  ;FORM1F IF YEx OUT BUFF POINT ADD #16.,R0  ;TOTAL BYTES MOV R0,POINT1-2 MOV #16.,R0  ;SET 16 COUNTER CHECK1: CMPB (R5),#'* BEQ LODUP1 CMPB (R5),#60  ;LOW CHECK BGE CHECK2 TSTB -(R5)  ;BUMP POINTER DEC R4 BEQ LOADUP BR CHECK1 CHECK2: CMPB (R5),#71  ;HIGH CHECK BLE CHEKOK TSTB -(R5) DEC R4 BEQ LOADUP BR CHECK1  ;KEEP TRYING CHEKOK: MOVB (R5),(R3)  ;MOVE IN CHAR. CMPB -(R5),-(R3) ;BUMP POINTERS DEC R0   ;DEC COUNTER BEQ LOAD1 DEC R4 BEQ LOW LINE BUFFER. SPOINT: 0   ;OUT BUF POINTER. .END z0),R0  ;DATA START ADDRESS. BR .+6   ;BR OVER. FORM1A: JSR PC,FTST1  ;END OF INPUT BUF? MOVB (R2)+,R4  ;GET A CHARACTER. CMPB R4,#'/  ;IS IT "/"? BNE .+12  ;BR IF NN. MOVB R4,(R0)+  ;PUT IN OUT BUFF. JSR PC,FTST  ;CHK BUFS. BR FORM1A+4  ;NEXT CHAR. CMPB R4,#'(  ;IS IT "("? BNE FORM1A  ;NO, NEXT CHAR. MOVB R4,(R0)+  ;YES, PUT IN BUFF. JSR PC,FTST  ;CHK BUF. STAT. MOVB (R2)+,R5  ;GET LINE NUMBER. MOVB R5,(R0)+  ;OUT BUFFER. JSR PC,{S. MOVB (R5)+,R3  ;GET A CHARACTER. JSR PC,CHTST  ;NUM,ALPHA,*? BNE FORM1E+4  ;FORM1E+4 IF NONE. MOVB R3,(R0)+  ;YES, PUT IN BUF. BR FORM1E  ;NEXT CHARACTER. FORM1F: TST NFLAG  ;NULL IN YET? BNE .+10  ;.+10 IF YES. CLRB (R0)+  ;NO, PUT IT IN. JSR PC,FTST2  ;OUT BUFF.FULL? MOV (SP)+,R3  ;RESTORE R3. MOV (SP)+,R2  ;RESTORE R2. BR FORM1A  ;CONTINUE. FTST: JSR PC,FTST2  ;CHK BOTH BUF STATS. FTST1: DEC R3   ;DEC BYTES LEFT. BEQ FRD2  ;;F|LOADUP  ; BR CHECK1  ;NEXT CHARACTER LOADUP: CLR R5 BR .+6 LODUP1: MOV #377,R5 LODUP2: TST R0   ;CHECK FOR ZERO COUNT BEQ LOAD1 MOVB R5,(R3) TSTB -(R3)  ;BUMP POINTER DEC R0   ;DEC COUNTER BR LODUP2 LOAD1: JSR R5,WRITE1 BUFF1 BR REENT  ;NEXT LINE INPUT: JSR R5,READ2 BUFF2 BNE EXIT MOV POINT2,R1  ;SET POINTER MOV POINT2-2,R2  ;GET BYTE COUNT RTS PC EXIT: TST (SP)+ MOVB #'/,@POINT1 MOV #1,POINT1-2 JSR R5,WRITE1 BUFF1 .C}  ;REVISION A ;DATE 4/29/73 .REG .TITLE FORM4 .GLOBL FORM4,SAVE,RESTOR,GET,LINK3 .GLOBL FILE3,LINK2,FILE2,LINK1,FILE1 .GLOBL READ3,BUFF3,BUFF1,POINT1,READ2 .GLOBL BUFF2,WRITE1,SWTCH4 COL4: 0   ;COL. IN WORK. FORM4: JSR R5,SAVE  ;SAVE~FTST  ;CHK BUF STATS. SWAB R5   ;GET LOW BYTE CLRB R5   ;OF LINE NUMBER. BISB (R2)+,R5  ; MOVB R5,(R0)+  ;PUT IN OUT BUF. JSR PC,FTST  ;CHK BUF. STAT. MOVB (R2)+,(R0)+ ;GET ")". JSR PC,FTST2  ;CHK OUT BUF. MOV R2,-(SP)  ;SAVE R2. MOV R3,-(SP)  ;SAVE R3. MOV COL3,R4  ;COLUMN POINTER. JSR PC,GET CLR (PC)+  ;CLEAR NULL FLAG. NFLAG: 0   ;NULL FLAG. MOV (R5)+,R4  ;GET BYTE COUNT. FORM1B: MOVB (R5)+,R3  ;GET A CHAR. JSR PC,CHTST  ;NRD2 IF NONE LEFT. RTS PC   ;RETURN IF ANY LEFT. FTST2: DEC R1   ;DEC BYTES LEFT. BEQ FWRT1  ;FWRT1 IF FULL. RTS PC   ;RETURN IF NOT FULL. FRD2: JSR R5,READ2  ;READ FILE2. BUFF2   ;BUFFER 2. BNE FRD2D  ;BR IF END OF FILE. MOV #BUFF2+4,R2  ;SET R2 TO DATA MOV (R2)+,R3  ;AND R3 TO BYTE CNT. MOV (R2),R2  ; RTS PC   ;RETURN. FRD2D: JSR PC,FWRT1  ;WRITE OUTPUT BUF. .CLOSE LINK3  ;CLOSE THE FILES. .CLOSE LINK2  ; .CLOSE LINK1  ; .DELOSE LINK1 .CLOSE LINK3 .CLOSE LINK2 .DELET LINK2,FILE2 JSR R5,RESTOR RTS PC   ;RETURN TO CALLER .END REGISGERS. CLR GET-6  ;INIT GET. .OPENI LINK3,FILE3 ;OPEN FILE3. .OPENI LINK2,FILE2 ;OPEN FILE2. .OPENO LINK1,FILE1 ;OPEN FILE1. JSR R5,READ3  ;1ST READ,FILE3. BUFF3   ;BUFFER #3. JSR PC,F4RD  ;1ST READ,FILE2. MOV BUFF1,R1  ;GET MAX BYTES. MOV POINT1,R0  ;OUT BUF. ADDRESS. BR .+6   ;BRANCH OVER. FORM4A: JSR PC,F4TST1  ;CHK INPUT BUF. MOVB (R2)+,R5  ;GET A CHAR. CMPB R5,#'/  ;IS IT A /? BNE .+10  ;NO, .+10. JSR PC,FORM4M  ;YES, PUT IUM,ALPHA,*? BEQ .+10  ;BR IF YES. DEC R4   ;END OF COLUMN? BEQ FORM1F  ;FORM1F IF YES. BR FORM1B  ;NO, NEXT CHAR. CLR R2   ;CLR A COUNTER. BR .+12 FORM1C: MOVB (R5)+,R3  ;GET A CHAR. JSR PC,CHTST  ;NUM,ALPHA,*? BNE FORM1D  ;FORM1D IF NONE. INC R2   ;INC COUNT. MOVB R3,(R0)+  ;PUT IN OUT BUF. JSR PC,FTST2  ;CHK BUF. FULL. DEC R4   ;END OF COLUMN? BEQ FORM1F  ;FORM1F IF YES. BR FORM1C  ;FORM1C IF NO. FORM1D: CMPB R3,#40  ;IS IT LET LINK2,FILE2 ;DELETE FILE2. CLR (SP)+  ;CLEAR THE STACK TST FPASS  ;1ST OR 2ND PASS? BNE FDONE  ;2ND, CLOSE & EXIT. MOV PC,FPASS  ;1ST, SET FLAG. CMP FMAX,#16. BLOS FRM1  ;LIMIT FMAX MOV #16.,FMAX  ;ABSOLUTE LIMIT.. BR FRM1   ;DO 2ND PASS. FDONE: JSR R5,RESTOR  ;RESTORE THE REG'S. RTS PC   ;RETURN. FWRT1: MOV #BUFF1+6,R1  ;GET BUFFER ADD. SUB (R1),R0  ;COMPUTE BYTE COUNT. MOV R0,-2(R1)  ;PUT AT BUF. HDR. MOV (R1),R0  ;BUF ADD. IN R0.N BUF. BR FORM4A+4  ;NEXT CHAR. CMPB R5,#'(  ;IS IT A (? BNE FORM4A  ;NO, NEXT CHAR. JSR PC,FORM4M  ;YES,PUT IN BUF. MOVB (R2)+,R5  ;GET LINE #. JSR PC,FORM4M  ;IN R5. SWAB R5   ; CLRB R5   ; BISB (R2)+,R5  ; JSR PC,FORM4M  ;CHK BUFFERS. MOVB (R2)+,(R0)+ ;GET THE (. JSR PC,F4TST2  ;CHK OUT BUF. MOV R2,-(SP)  ;SAVE R2 AND R3. MOV R3,-(SP)  ; MOV FORM4-2,R4  ;GET COLUMN /#. MOV #ZTAB,R2  ;GET Z TABLE ADDRESS IN R2. CMPB R4,#A SPACE? BEQ .+10  ;YES, .+10. CMPB R3,#'-  ;NO, IS IT A "-"? BNE FORM1D-6  ;FORM1D-6 IF NOT. CMP R2,FMAX  ;R2 >FMAX? BLOS .+6  ;.+6 IF NO. MOV R2,FMAX  ;UPDATE FMAX. INC NFLAG  ;SET NFLAG. CLRB (R0)+  ;0 SEPARATOR. FORM1E: JSR PC,FTST2  ;BUFFER FULL? DEC R4   ;END OF INPUT. BEQ FORM1F  ;FORM1F IF YES. MOVB (R5)+,R3  ;GET A CHARACTER. JSR PC,CHTST  ;NUM,ALPHA,*? BNE FORM1E+4  ;FORM1E+4 IF NONE. MOVB R3,(R0)+  ;YES, PUT IN BUF. B MOV -6(R1),R1  ;MAX BYTES IN R1. JSR R5,WRITE1  ;WRITE THE BUFFER. BUFF1   ;BUFFER #1. RTS PC   ;RETURN. CHTST: CMPB R3,#'*  ;IS IT "*"? BNE .+4   ;BR IF NO. RTS PC   ;RETURN IF YES. CMPB R3,#60  ;IS IT A NUMBER? BLO CHTST2  ;CHTST2 IF NUM? BHI CHTST2  ;BR IF YES. CHTST1: SEZ   ;SET Z FOR OK CHAR. RTS PC   ;RETURN. CHTST2: CMPB R3,#100  ;IS IT A LETTER? BLO .+10  ;BR IF LETTER .TITLE MINI ;MINI-MON ;PROGRAM CONTROLLER .GLOBL TRA. .ASECT .=16250 .REG BEGIN=17000 PRGM1: .RAD50 /EXE/ .RAD50 /C/ .RAD50 /OVL/ PRGM2: .RAD50 /TRN/ .RAD50 /GEN/ .RAD50 /OVL/ PRGM3: .RAD50 /SOR/ .RAD50 /T/ .RAD50 /OVL/ PRGM4: .RAD50 /LIS/ .RAD50 /TER/ .RAD50 /OVL/'Z  ;IS COLUMN REQUESTED Z? BNE FRM4A2  ;NORMAL FORMAT IF NOT. MOV R5,R3  ;SAVE LINE #. FRM4A1: MOV R3,R5  ;RESTORE LINE # TO R5 AFTER GET. CLR R4   ;IF Z, USE DATE FROM 1ST BISB (R2)+,R4  ;COLUMN, IN ORDER OF ZTAB, WHICH CMP R2,#ZTAB+5  ;IS NOT AN ASTERISK. BHIS FRM4A2  ;LAST COLUMN OF ZTAB IS DEFAULT. JSR PC,GET  ;GET NEXT COLUMN OF ZTAB. CMPB 2(R5),#'*  ;IS 1ST CHARACTER A *? BEQ FRM4A1  ;TRY NEXT COLUMN OF ZTAB IF YES. BR FORM4B  ;USE THIS COLUMR FORM1E  ;NEXT CHARACTER. FORM1F: TST NFLAG  ;NULL IN YET? BNE .+10  ;.+10 IF YES. CLRB (R0)+  ;NO, PUT IT IN. JSR PC,FTST2  ;OUT BUFF.FULL? MOV (SP)+,R3  ;RESTORE R3. MOV (SP)+,R2  ;RESTORE R2. BR FORM1A  ;CONTINUE. FTST: JSR PC,FTST2  ;CHK BOTH BUF STATS. FTST1: DEC R3   ;DEC BYTES LEFT. BEQ FRD2  ;;FRD2 IF NONE LEFT. RTS PC   ;RETURN IF ANY LEFT. FTST2: DEC R1   ;DEC BYTES LEFT. BEQ FWRT1  ;FWRT1 IF FULL. RTS PC   ;RETURN IF NOT F? BLOS CHTST1  ;CHTST1 IF NO. CLZ   ;CLR Z FOR NO GOOD. RTS PC   ;RETURN. FRM1: .RENAM LINK1,FILE1,FILE2 .OPENO LINK1,FILE1 .OPENI LINK2,FILE2 .OPENI LINK3,FILE3 JSR PC,FRD2  ;1ST READ, FILE2. MOV #BUFF1,R0  ;OUTPUT POINTERS. MOV (R0)+,R1  ;R1-MAX BYTE COUNT. MOV 4(R0),R0  ;R0-POINTER. BR .+6   ;BR OVER. FRM1A: JSR PC,FTST1  ;CHK IN BUF. MOVB (R2)+,R5  ;GET A CHAR. CMPB R5,#'(  ;IS IT A "("? BEQ FRM1A1  ;FRM1A1 IF YES. CMPB R5, DONE: ;EXECUTION TABLE TABLE: 0,0,0,0 0,0,0,0 0,0,0,0 0,0,0,0 FEEDS: 0 COLUMN: 0 OPTION: 0,0,0,0 0,0,0,0 LISTS: 0,0,0,0 0,0,0,0 0,0,0,0 0,0,0,0 COPIES: 0 .WORD 0 LINK: .WORD 0 .RAD50 /DOG/ .BYTE 1,0 .RAD50 /DF/ .WORD 0 .BYTE 0,0 FILE: .WORD 0   ;FILL IN TYPE! .WORD 0   ; .WORD 0   ; .BYTE 1,1  ;LOG NUMBER .WORD 0 BUFF: .WORD 37460-BEN IF NOT AN *. ZTAB: .ASCII /KJIHG/  ;ORDER OF COLUMNS FOR "Z" FORMAT. .EVEN FRM4A2: JSR PC,GET  ;GET THE COLUMN. FORM4B: MOV (R5)+,R4  ;BYTE CNT. MOV #YEAR+2,R3  ;MONTH IS FIRST. CLR -(R3) CLR -(R3) CLR -(R3) FORM4D: JSR PC,FORM4K  ;IS IT A #. BLO FORM4E  ;YES, FORM4E. CMPB (R5)+,#'-  ;NO, IS IT A -? BNE FORM4F  ;NO, FORM4F. TST (R3)+  ;YES, NEXT PART. CMP R3,#YEAR  ;STOP AT YEAR. BLOS FORM4D  ; BR FORM4F+4  ;OUTPUT THIS DATE. FORM4EULL. FRD2: JSR R5,READ2  ;READ FILE2. BUFF2   ;BUFFER 2. BNE FRD2D  ;BR IF END OF FILE. MOV #BUFF2+4,R2  ;SET R2 TO DATA MOV (R2)+,R3  ;AND R3 TO BYTE CNT. MOV (R2),R2  ; RTS PC   ;RETURN. FRD2D: JSR PC,FWRT1  ;WRITE OUTPUT BUF. .CLOSE LINK3  ;CLOSE THE FILES. .CLOSE LINK2  ; .CLOSE LINK1  ; .DELET LINK2,FILE2 ;DELETE FILE2. CLR (SP)+  ;CLEAR THE STACK TST FPASS  ;1ST OR 2ND PASS? BNE FDONE  ;2ND, CLOSE & EXIT. MOV PC,FPASS  #'/  ;IS IT A "/"? BNE FRM1A  ;FRM1A IF NO. MOVB R5,(R0)+  ;YES, PUT IN BUF. FRM1AA: JSR PC,FTST  ;CHK BOTH BUFFS. BR FRM1A+4  ;NEXT CHAR. FRM1A1: MOVB R5,(R0)+  ;PUT "(" IN BUF. JSR PC,FTST  ;CHK BOTH BUFFS. MOV #3,R5  ;3 COUNTER. FRM1A2: MOVB (R2)+,(R0)+ ;MOV IN THE ITEM JSR PC,FTST  ;NUMBER AND ")". DEC R5   ;ALL THREE YET? BNE FRM1A2  ;NO, LOOP. MOV FMAX,R5  ;BET FMAX. MOV #16.,R4  ;MAX BYTES. BR .+6   ;BRANCH OVER. FRM1B: JSR PC,GIN .BYTE 7,0 .WORD 0 .WORD BEGIN INIT: MOV #TABLE,R0  ;GET TABLE ADDRESS MOV #43.,R1  ;SET UP A WORD COUNT INIT1: CLR (R0)+  ;CLR A LOCATION DEC R1   ;DEC WORD COUNT BNE INIT1  ;BR IF NOT DONE INIT2: MOV (PC)+,R0  ;PICK UP PROGRAM LIST INIT3: PRGM1   ;START WITH PROGRAM #1 MOV #FILE,R1  ;GET ADDRESS OF FILE NAME MOV (R0)+,(R1)+  ;LOAD FILE BLOCK WITH MOV (R0)+,(R1)+  ;FILE NAME. : TSTB (R3)+  ;1ST DIGIT IN YET? BEQ FORM4H  ;NO, FORM4H. TSTB (R3)  ;2ND DIGIT IN YET? BNE FORM4I  ;YES, IGNOR MORE. MOVB (R5)+,(R3)  ;NO, PUT IT IN. DEC R3   ;RESET R3. FORM4F: DEC R4   ;DEC COL. BYTE CNT. BNE FORM4D  ;FORM4D IF NOT 0. MOV #DAY+1,R3  ;LOOK FOR INPUT FORMAT TSTB (R3)  ;"MONTH-YEAR" INSTEAD OF BEQ FRM4F1  ;"MONTH-DAY-YEAR". DEC R3   ;BUMP R3 TO 1ST BYTE OF DAY. CMPB (R3)+,#63  ;1ST CHARACTER 3 OR HIGHER? BLO FRM4F1  ;GO;1ST, SET FLAG. CMP FMAX,#16. BLOS FRM1  ;LIMIT FMAX MOV #16.,FMAX  ;ABSOLUTE LIMIT.. BR FRM1   ;DO 2ND PASS. FDONE: JSR R5,RESTOR  ;RESTORE THE REG'S. RTS PC   ;RETURN. FWRT1: MOV #BUFF1+6,R1  ;GET BUFFER ADD. SUB (R1),R0  ;COMPUTE BYTE COUNT. MOV R0,-2(R1)  ;PUT AT BUF. HDR. MOV (R1),R0  ;BUF ADD. IN R0. MOV -6(R1),R1  ;MAX BYTES IN R1. JSR R5,WRITE1  ;WRITE THE BUFFER. BUFF1   ;BUFFER #1. RTS PC   ;RETURN. CHTST: CMPB R3,#'*  ;ISFTST  ;CHK BUFFERS. MOVB (R2)+,(R0)  ;GET A CHAR. BEQ FRM1C  ;FRM1C IF NULL. CMPB (R0)+,#'*  ;IS IT AN "*"? BNE .+10 MOVB #377,-1(R0) DEC R4   ;DEC MAX. BLE FRM1AA  ;NO MORE IF 0. DEC R5 BGT FRM1B JSR PC, FTST2 BR FRM1E FRM1C: CLRB (R0)+  ;FILL IN NULLS. DEC R4   ;DEC MAX. BLE FRM1AA  ;NO MORE IF 0. JSR PC,FTST2  ;CHK OUT BUF. DEC R5   ;DEC MAX. BGT FRM1C  ;FRMIC IF NOT 0. FRM1E: JSR PC,FTST1  ;CHK IN BUF. MOVB (R2)+,R5  MOV (R0)+,(R1)+  ; MOV R0,INIT3  ;LOAD ADDRESS OF NEXT FILE NAME. CMP #DONE,R0  ;CHECK FOR ALL PROGRAMS RUN BNE INIT4  ;IF NOT,BRANCH. MOV #PRGM1,INIT3 ;REINIT PROGRAM #1. INIT4: .INIT LINK .OPENI LINK,FILE .READ LINK,BUFF .WAIT LINK .CLOSE LINK .RLSE LINK INIT5: MOV #TABLE,-(SP) ;GIVE THE PROGRAM AD ADDRESS. JSR PC, BEGIN  ;FIRST WORD OF PROGRAM TST (SP)+  ;CLR THE STACK CMP #PRGM1,INIT3 ;CHECK FOR A CLEAR OPERATION BNE INIT2  ;CONTINUE O TO FRM4F1 IF NOT. BHI .+10  ;.+10 IF YEAR INSTEAD OF DAY. CMPB (R3),#61  ;2ND CHARACTER HIGHER THAN 1? BLOS FRM4F1  ;FRM4F1 IF NO. DEC R3   ;BUMP R3 TO 1ST DIGIT. MOV (R3)+,(R3)  ;MOVE DAY TO YEAR. CLR -(R3)  ;CLEAR DAY. FRM4F1: MOV #YEAR,R3  ;DONE, OUTPUT DATE. JSR PC,FORM4J  ;YEAR 1ST. MOV #MONTH,R3  ;THEN MONTH. JSR PC,FORM4J  ; TST (PC)+  ;LOOK FOR OMIT DAY OPTION. SWTCH4: 0   ;FLAG FOR OMIT DAY OPTION. BEQ .+4   ;LEAVE DAY IF NULL. IT "*"? BNE .+4   ;BR IF NO. RTS PC   ;RETURN IF YES. CMPB R3,#60  ;IS IT A NUMBER? BLO CHTST2  ;CHTST2 IF NUM? BHI CHTST2  ;BR IF YES. CHTST1: SEZ   ;SET Z FOR OK CHAR. RTS PC   ;RETURN. CHTST2: CMPB R3,#100  ;IS IT A LETTER? BLO .+10  ;BR IF LETTER? BLOS CHTST1  ;CHTST1 IF NO. CLZ   ;CLR Z FOR NO GOOD. RTS PC   ;RETURN. FRM1: .RENAM LINK1,FILE1,FILE2 .OPENO LINK1,FILE1 .OPEN;GET A CHAR. BEQ FRM1E  ;IGNOR NULLS. CMPB R5,#'(  ;( OR / IS BEQ FRM1G  ;END OF THIS COLUMN. CMPB R5,#'/  ; BEQ FRM1G  ;FRM1G IF EITHER. MOVB R5,(R0)+  ;PUT IN OUT BUF. JSR PC,FTST2  ;CHK BUF STAT. DEC R4   ;DEC COLUMN MAX CNT. BNE FRM1E  ;FRM1E IF NOT 0. FRM1F: JSR PC,FTST1  ;CHK IN BUF BR FRM1A+4  ;GET NEXT COLUMN. FRM1G: CLRB (R0)+  ;FILL IN WITH NULLS. JSR PC,FTST2  ;CHK OUT BUF. DEC R4   ;COLUMN MAX. BNE FRM1G  ;FRM1G IF NOTPERATION BR INIT   ;RE START .=.+21320 .END INIT CLR (R3)  ;OMIT DAY OF MONTH JSR PC,FORM4J  ;THEN DAY. MOV #10.,R3  ;FILL IN WITH NULLS. FORM4G: CLRB (R0)+  ;CLEAR A BYTE. JSR PC,F4TST2  ;CHK OUT BUF. DEC R3   ;DONE? BNE FORM4G  ;NO, LOOP. MOV (SP)+,R3  ;YES, RESTORE R3. MOV (SP)+,R2  ;AND R2. BR FORM4A  ;NEXT LINE. FORM4H: MOVB (R5)+,-(R3) ;PUT IN 1ST DIGIT. BR FORM4F  ;NEXT CHARACTER. FORM4I: INC R5   ;SKIP THIS ONE. BR FORM4F-2  ;NEXT ONE. FORM4J: TSTB 1(R3)  ;CHECK FOR ONLY ONE DI LINK2,FILE2 .OPENI LINK3,FILE3 JSR PC,FRD2  ;1ST READ, FILE2. MOV #BUFF1,R0  ;OUTPUT POINTERS. MOV (R0)+,R1  ;R1-MAX BYTE COUNT. MOV 4(R0),R0  ;R0-POINTER. BR .+6   ;BR OVER. FRM1A: JSR PC,FTST1  ;CHK IN BUF. MOVB (R2)+,R5  ;GET A CHAR. CMPB R5,#'(  ;IS IT A "("? BEQ FRM1A1  ;FRM1A1 IF YES. CMPB R5,#'/  ;IS IT A "/"? BNE FRM1A  ;FRM1A IF NO. MOVB R5,(R0)+  ;YES, PUT IN BUF. FRM1AA: JSR PC,FTST  ;CHK BOTH BUFFS. BR FRM1A+4  ;NEXT CHA 0. MOVB R5,(R0)  ;PUT ( OR / IN BUF. BR FRM1A+6  ;NEXT LINE. .END ;MINI-MON ;PROGRAM CONTROLLER .ASECT .=16250 .REG BEGIN=17000 PRGM1: .RAD50 /EXE/ .RAD50 /C/ .RAD50 /OVL/ PRGM2: .RAD50 /TIGIT. BNE .+4   ;MAKE IT THE 2ND ONE IF THERE SWAB (R3)  ;IS ONLY ONE. JSR PC,(PC)  ;DO THE NEXT FOUR INSTRUCTIONS MOVB (R3)+,(R0)+ ;TWICE. MOVE THE TWO DIGITS BNE .+10  ;FOR YEAR, MONTH, OR DAY INTO MOVB #60,-1(R0)  ;THE OUTPUT BUFFER. MAKE BR F4TST2  ;NULLS ASCII 0. FORM4K: CMPB (R5),#'*  ;IS IT AN *? BNE FORM4L  ;NO, FORM4L. MOVB #377,(R0)+  ;YES, CONVERT TO 377. MOV #16.,R3  ;FILL IN NULLS. CLR (SP)+  ;CLEAR THE STACK. BR FORM4G+2  ;GO TOR. FRM1A1: MOVB R5,(R0)+  ;PUT "(" IN BUF. JSR PC,FTST  ;CHK BOTH BUFFS. MOV #3,R5  ;3 COUNTER. FRM1A2: MOVB (R2)+,(R0)+ ;MOV IN THE ITEM JSR PC,FTST  ;NUMBER AND ")". DEC R5   ;ALL THREE YET? BNE FRM1A2  ;NO, LOOP. MOV FMAX,R5  ;BET FMAX. MOV #16.,R4  ;MAX BYTES. BR .+6   ;BRANCH OVER. FRM1B: JSR PC,FTST  ;CHK BUFFERS. MOVB (R2)+,(R0)  ;GET A CHAR. BEQ FRM1C  ;FRM1C IF NULL. CMPB (R0)+,#'*  ;IS IT AN "*"? BNE .+10 MOVB #377,-1(R0)~.THTLD PRF@JD ~.FLNBL RT@RT,HNHT,BDFHN,DH@LNF,LHNJR,HNR,FDT ~.FLNBL RD@RBH,BTFFR ~.DND RN/ .RAD50 /GEN/ .RAD50 /OVL/ PRGM3: .RAD50 /SOR/ .RAD50 /T/ .RAD50 /OVL/ PRGM4: .RAD50 /LIS/ .RAD50 /TER/ .RAD50 /OVL/ DONE: ;EXECUTION TABLE TABLE: 0,0,0,0 0,0,0,0 0,0,0,0 0,0,0,0 FEEDS: 0 COLUMN: 0 OPTION: 0,0,0,0 0,0,0,0 LISTS: 0,0,0,0 0,0,0,0 0,0,0,0 0,0,0,0 COPIES: 0 .WORD 0 LINK: .WORD 0 .RAD50 /DOG/ .BYTE 1,0 .RAD50 /DF/ .WORD 0 . FORM4G. FORM4L: CMPB (R5),#71  ;IS IT AN ASCII #? BHI .+6   ;NO, EXIT. CMPB #57,(R5)  ;LESS THAN #0? RTS PC   ;RET. FORM4M: MOVB R5,(R0)+  ;OUTPUT THE CHAR. F4TST: JSR PC,F4TST2  ;CHK BOTH BUFFS. F4TST1: DEC R3   ;END OF IN BUF? BEQ F4RD  ;READ MORE IF YES. RTS PC   ;RETURN IF NO. F4TST2: DEC R1   ;OUT BUF FULL? BEQ F4WRT  ;WRITE IF YES. RTS PC   ;RETURN IF NO. F4RD: JSR R5,READ2  ;READ FILE2. BUFF2   ;INTO BUFFER #2. BNE F4RD1   DEC R4   ;DEC MAX. BLE FRM1AA  ;NO MORE IF 0. DEC R5 BGT FRM1B JSR PC, FTST2 BR FRM3E FRM1C: CLRB (R0)+  ;FILL IN NULLS. DEC R4   ;DEC MAX. BLE FRM1AA  ;NO MORE IF 0. JSR PC,FTST2  ;CHK OUT BUF. DEC R5   ;DEC MAX. BGT FRM1C  ;FRMIC IF NOT 0. FRM3E: MOV #F3BUF,R5  ;RITE JUST BUF. JSR PC,FTST1  ;CHK IN BUF. MOVB (R2)+,(R5)  ;GET A CHAR. BEQ .-6   ;IGNOR NULLS. CMPB (R5),#'(  ;IS IT "("? BEQ FRM3F  ;YES, FRM3F. CMPB (R5) ;TITLE SEARCH ;4/20/73 ;SEARCH OUT LINES AS DEFINED BY TEMP2 AND ;COLUMNS AS REQUIRED IN SRTABL. ;ENTER WITH JSR PC, SEARCH. ;EXITS WITH RTS PC ;REVISION A ;DATE 4/28/73 ;ADD JSR PC,LINF UPON DETECTION OF "/". ;LINF PRINTS N NUMBER OF LINE FEEDS FOLLOWING ;SORTBYTE 0,0 FILE: .WORD 0   ;FILL IN TYPE! .WORD 0   ; .WORD 0   ; .BYTE 1,1  ;LOG NUMBER .WORD 0 BUFF: .WORD 37460-BEGIN .BYTE 7,0 .WORD 0 .WORD BEGIN INIT: MOV #TABLE,R0  ;GET TABLE ADDRESS MOV #43.,R1  ;SET UP A WORD COUNT INIT1: CLR (R0)+  ;CLR A LOCATION DEC R1   ;DEC WORD COUNT BNE INIT1  ;BR IF NOT DONE INIT2: MOV (PC)+,R0  ;PICK UP PROGRAM LIST INIT3: PRGM1   ;ST;BRANCH IF EOF. MOV #BUFF2+4,R2  ;GET BYTE CNT IN R3. MOV (R2)+,R3  ; MOV (R2),R2  ;POINTER IS R2. RTS PC   ;RETURN. F4RD1: JSR PC,F4WRT  ;WRITE LAST BUFFER. .CLOSE LINK3  ;CLOSE FILE3. .CLOSE LINK2  ;CLOSE FILE2. .CLOSE LINK1  ;CLOSE FILE1. .DELET LINK2,FILE2 ;DELETE FILE2. CLR (SP)+  ;CLEAR THE STACK. JSR R5,RESTOR  ;RESTORE THE REG'S. RTS PC   ;RETURN. F4WRT: MOV #BUFF1+6,R1  ;CALCULATE BYTE CNT. SUB (R1),R0  ; MOV R0,-2(R1)  ;P,#'/  ;IS IT "/"? BEQ FRM3F  ;YES, FRM3F. INC R5   ;BUMP POINTER. CMP R5,#F3BUF+20. ;END OF RITE BUF. BLO FRM3E+4  ;NO, NEXT CHAR. FRM3F: MOVB (R5),-(SP)  ;SAVE ( OR /. MOV R4,-(SP)  ;SAVE BYTES LEFT. SUB #F3BUF,R5  ;GET RITE JUST BYTES. CMP R5,R4  ;MORE THAN ROOM? BHIS FRM3G  ;FRM3G IF >=. SUB R5,R4  ;NO, GET NULLS NEEDED. FRM3F1: JSR PC,FTST2  ;CHK OUT BUF. CLRB (R0)+  ;FILL IN NULLS. DEC (SP)  ;DEC MAX. BLE FRM3G2  ;FRM3G2 IF NO MORE FIELDS. .REG .TITLE SEARCH .GLOBL SEARCH,BUFF2,GET,POINT2,POINT1,READ2 .GLOBL SPACES,SRTABL,WRITE1,BUFF1 .GLOBL SPOINT,SBYTES,LINK1,LINF SEARCH: MOV (PC)+,R1  ;BUFFER POINTER IN R1 SPOINT: 0 MOV (PC)+,R2  ;AVAIL BYTES IN R2 SBYTES: 0 CMPB (R1),#'/  ;LOOK FOR /. BNE .+6   ;BRANCH OVER IF NOT /. JSR PC,LINF  ;PUT OUT LINE FEEDS. CMPB #'(,(R1)+  ;LOOK FOR OPEN CHAR. BEQ GETLIN  ;BR IF FIND DEC R2   ;REDUCE BYTE COUNT BNE .+6   ;SEDUCE IF ZEART WITH PROGRAM #1 MOV #FILE,R1  ;GET ADDRESS OF FILE NAME MOV (R0)+,(R1)+  ;LOAD FILE BLOCK WITH MOV (R0)+,(R1)+  ;FILE NAME. MOV (R0)+,(R1)+  ; MOV R0,INIT3  ;LOAD ADDRESS OF NEXT FILE NAME. CMP #DONE,R0  ;CHECK FOR ALL PROGRAMS RUN BNE INIT4  ;IF NOT,BRANCH. MOV #PRGM1,INIT3 ;REINIT PROGRAM #1. INIT4: .INIT LINK .OPENI LINK,FILE .READ LINK,BUFF .WAIT LINK .CLOSE LINK .RLSE LINK INIT5: MOV #TABLE,-(SP) ;GIVE THE PROGRAM AD ADDRESS. JSR UT IN HEADER. MOV (R1),R0  ;RESET POINTER. MOV -6(R1),R1  ;AND MAX BYTES. JSR R5,WRITE1  ;WRITE THE BUFFER. BUFF1   ;BUFFER #1. RTS PC   ;RETURN. MONTH: 0   ;GET MONTH HERE. DAY: 0   ;DAY, AND YEAR. YEAR: 0   ;2 DIGITS MAX. .END . DEC R4   ;DEC NULLS NEEDED. BGT FRM3F1  ;LOOP TILL 0. FRM3G: MOV (SP),R4  ;RETRIEVE MAX. BLE FRM3G2  ;FRM3G2 IF =<0. MOV #F3BUF,R5  ;DATA ADDRESS. FRM3G1: JSR PC,FTST2  ;CHK OUT BUF. MOVB (R5)+,(R0)+ ;MOV IN THE DATA. DEC R4   ;DEC MAX. BGT FRM3G1  ;LOOP TILL 0. FRM3G2: CLR (SP)+  ;CLEAR THE STACK. JSR PC,FTST2  ;CHK OUT BUF. MOVB (SP)+,R5  ;GET ( OR /. BR FRM1A+6  ;NEXT LINE. F3BUF: .=.+20.   ;RITE JUST BUFFER. .END RO JSR PC, READMO  ;READ MORE BR SBYTES+2  ;LOOP TIL FIND ( GETLIN: DEC R2   ;REDUCE BYTE COUNT BNE .+6 JSR PC, READMO  ;SAME AS ABOVE MOVB (R1)+,R5  ;HIGH BYTE BPL .+6   ;IF MINUS, PRINT LINES FEEDS. JSR PC,LINF  ; SWAB R5   ;IN HIGH BYTE POSITION CLRB R5 DEC R2   ;VERY SLOPY BNE .+6 JSR PC, READMO BISB (R1)+,R5 DEC R2 BNE .+6 JSR PC, READMO MOV R1,SPOINT  ;UPDATE POINTER MOV R2,SBYTES  ;UPDATE BYTES AVAIL MOV #SRTABL,PC, BEGIN  ;FIRST WORD OF PROGRAM TST (SP)+  ;CLR THE STACK CMP #PRGM1,INIT3 ;CHECK FOR A CLEAR OPERATION BNE INIT2  ;CONTINUE OPERATION BR INIT   ;RE START .END INIT R3  ;GET ENTRY TABLE CLR R1   ;INIT R1 FOR TOTAL BYTES MOV POINT1,R0  ;SET BUFFER POINTER MOV R5,-(SP)  ;STORE LINE # SRCH1: TST (R3) BEQ SEXIT MOV #SPACES,R2  ;LOCATE SPACE TABLE CMPB (R2)+,(R3)  ;LOOK FOR ENTRY CHAR BNE .-2 MOVB (R2),R2  ;# OF SPACES ADD R2,R1  ;TALLY BYTE COUNT MOV (R3)+,R4  ;CHARACTER FIELD MOV (SP),R5  ;GET LINNE # JSR PC, GET  ;DO THE JOB ON IT MOV (R5)+,R4  ;GET GET BYTE COUNT TST R4 BEQ SRCH3 SPADEL: CMPB #4 ;TRANS/SORT/PRINT ;THIS ROUTINE IS USED TO READ A LINKED ;FILE (FILE3) AND CREATE FROM IT A ;CONTIGUOUS FILE. ;ENTERED BY JSR PC. ;THE FILE BLOCK FOR FILE3 IS INITED ;PRIOR TO CALLING TRANS. .REG . .REG .TITLE EXEC  ENTRY: .INIT KBLINK  ;INITIALIZE TTY KEYBOARD .INIT PTLINK  ;INITIALIZE TTY PRINTER .OPENI KBLINK,KBFILE ;OPEN FOR INPUT .OPENO PTLINK,PTFILE ;OPEN FOR OUTPUT ENTRY1: JSR R5,WTPT  ;PRINT THE FOLLOWING: .BYTE DIA1E-D0,(R5)  ;IGNOR SPACES AT BNE NOPRT1  ;BEGINNING OF DATA DEC R4   ; BEQ SRCH3  ; TSTB (R5)+  ; BR SPADEL  ; NOPRT1: CMPB (R5),#40  ;NON PRINT CHARACHERS BGE NOPRT2  ; DEC R4   ; BEQ SRCH3  ; TSTB (R5)+  ; BR NOPRT1  ; NOPRT2: CMPB (R5),#140  ;NON PRINT CHARACTERS BLE SRCH2 DEC R4 BEQ SRCH3  ; TSTB (R5)+  ; BR NOPRT1 SRCH2: CMPB #12,(R5)  ;LOOK FOR LF BNE SRCH4 DEC R4 BEQ SRCH3 TSTB (R5)+ BR NOPRT1 SRCH4: C .TITLE BEGIN .GLOBL TRNLNK,READ4 .GLOBL BUFF1,FILE1,FILE2,FILE3,LINK1,LINK2,BUFF3 .GLOBL LINK3,POINT1,POINT3,READ3,WRITE2,SORT .GLOBL FORM1,FORM2,FORM3,FORM4,LINK4,FILE4 .GLOBL BEGIN,SRTABL,READ2,WRITE1 .GLOBL POINT2,BUFF2,SWTCH4,SAVE,RESTOR .GLOBL READ4  .REG BEGIN: MOV 2(SP),R0  ;ADDRESS OF MINI.MON TABLETITLE TRANS .GLOBL TRA.,LINK3,FILE3,TABLE,SAVE,RESTOR .GLOBL READ3,BUFF3,POINT2,BUFFB .GLOBL POINT3,BUFF1,POINT1 TRANS: .INIT TRNLNK  ;INIT THE TRNLNK DEVICE. .INIT LINK3  ;INIT THE LINK3 DEVICE. .STAT LINK3  ;GET DEVICE FACILITY WORD AT STAT3. MOV (SP)+,STAT3  ;REFERENCED TO SEE IF FILE3 CMP (SP)+,(SP)+  ;DEVICE IS FILE STRUCTURED. TRANS1: .LOOK TRNLNK,TRNFIL, ;SEE IF THE CONTIGUOUS FILE MOV (SP),MIN  ;EXISTS AND SET UP POINTERS ADD (SP)+,(SP)  ;IF IT DOES.IA1 ;BYTE COUNT DIA1: .ASCII /SORT11 REV: 5-18-73/ .BYTE 15,12 .ASCII /COLUMNS:/ .EVEN .WORD 5413 DIA1E: JSR PC, INPUT  ;GET INPUT FROM KEYBOARD JSR R5,CKLDL  ;CHECK AND LOAD LETTERS 13.   ;MAX ENTRIES STABLE   ;ADDRESS OF LOAD BR .+6   ;NORMAL RETURN BR ENTRY2  ;NO ENTRY RETURN BR ENTRY1  ;ERROR RETURN  ENTRY2: JSR R5, WTPT  ;PRINT THE FOLLOWING .BYTE DIA2E-DIA2 ;BYTE COUNT DIA2: .ASCII /LINE FEEDS:/ .EVEN .WORD 5413 DIA2E: JSR PCMPB #15,(R5)  ;LOOK FOR CR BNE SRCH5 DEC R4 BEQ SRCH3 TSTB (R5)+ BR NOPRT1 SRCH5: TST R4 BEQ SRCH3 MOVB (R5)+,(R0)+ ;LOAD CHAR. DEC R2   ;REDUCE MAX BYTES DEC R4   ;REDUCE AVAIL BYTES BNE NOPRT1  ;KEEP GOING SRCH3: TST R2 BEQ SRCH1 BMI OFL   ;CHECK FOR OVERFLOW MOVB #40,(R0)+  ;LOAD IN SPACES DEC R2 BNE SRCH3 BR SRCH1 OFL: DEC R0   ;BUMP POINTER INC R2   ;BYTES BNE OFL   ; BR SRCH1 SEXIT: TST (SP)+  ;UNLOAD LINE . MOV #SRTABL,R1  ;ADDRESS OF SORT TABLE MOV #16.,R2  ;SRTABL LENGTH. TST(R0)   ;ANY ENTRIES? BEQ BEG5  ;EXIT IF NONE. BEG1: CMP (R0),#100  ;ALLOW ONLY LEGAL FIELDS. BLOS BEG4  ;BEG4 IF NOT LEGAL. CMP (R0),#115  ; BHI BEG3  ;CHECK SECOND RANGE. MOV (R0)+,(R1)+  ;LOAD GOOD VALUES. BEG2: DEC R2   ;DECREMENT COUNTER. BGT BEG1  ;NEXT ENTRY, IF ANY. MOV #10.,R2  ;LOAD FEEDS,COLUMNS, AND OPTIONS. MOV #SRTABL+40,R1 ;SET R1. MOV (R0)+,(R1)+  ;LO MOV (SP)+,MAX  ;MAX HOLDS LAST BLOCK ADD. TSTB (SP)  ;DOES IT EXIST? BPL TRANS2  ;GO TO TRANS2 IF NOT. ROLB (SP)+  ;IS IT CONTIGUOUS IF EXISTENT? BPL TRANS3  ;GO TO TRANS3 IF NOT. MOV MIN,BLK  ;INITIALIZE TRANSFER POINTER BR INIT   ;START THE TRANSFER. TRANS2: CLR (SP)+  ;CLEAR THE STACK. .ALLOC TRNLNK,TRNFIL,1000. ;ALLOCATE THE FILE. INC (SP)+  ;ALLOCATED OK? BEQ TRANS1  ;GO TO TRANS1 IF YES. TRANS3: .INIT KBLNK  ;PRINT ERROR MESSAGE IF NOT. ., INPUT  ;GET INPUT FROM KEYBOARD JSR R5,CKLDN  ;CHECK AND LOAD NUMBER. FEEDS   ;ADDRESS OF LOAD BR .+6 BR SCAN   ;NO ENTRY RETURN BR ENTRY2  ;ERROR RETURN ENTRY3: JSR R5, WTPT  ;PRINT THE FOLLOWING .BYTE DIA3E-DIA3 ;BYTE COUNT DIA3: .ASCII /AT COLUMN:/ .EVEN .WORD 5413 DIA3E: JSR PC, INPUT  ;GET INPUT FROM DEYBOARD JSR R5,CKLDL  ;CHECK AND LOAD LETTERS 4   ;MAX ENTRIES COLUMN   ;ADDRESS OF LOAD BR .+6   ;NORMAL RETURN BR ENTRY3  # MOVB #12,(R0)+  ;LINE FEED INC R1 .WAIT LINK1  ;PREVIOUS BUFFER MOV R1,POINT1-2  ;SET UP BUFFER JSR R5,WRITE1 BUFF1 CLR R4   ;MESSAGE TO BEGIN RTS PC READMO: JSR R5,READ2  ;READ TEMP.2 BUFF2 BNE SOUT MOV POINT2,R1  ;UPDATE POINTER MOV POINT2-2,R2  ;UPDATE BYTE COUNT RTS PC SOUT: MOV #1,R4  ;VERY VERY SLOPY TST (SP)+  ;GO DIRECTLY TO JAIL RTS PC   ;NO MORE .END AD A CHARACTER. DEC R2   ;DECREMENT THE COUNTER. BGT .-4   ;LOOP. TST SRTABL  ;ANY LEGAL ENTRIES? BNE BEGIN1  ;SORT IF ANY. BEG5: RTS PC   ;EXIT IF NONE. BEG3: CMP (R0),#132  ;CHECK SECOND RANGE. BHI BEG4  ;BEG4 IF OUT OF RANGE. CMP (R0),#132  ;OTHER END OF RANGE. BHIS BEG2-2  ;LOAD VALUE IF GOOD. BEG4: TST (R0)+  ;BUMP R0 PAST BAD ENTRX. BR BEG2   ;NEXT ENTRY. BEGIN1: .INIT LINK1 .INIT LINK2 JSR R5,DELETE  ;DELETE FILE "TEMP1". FILEWRITE KBLNK,TBUF ;WRITE THE MESSAGE. BR .   ;HANG HERE TILL SOMEBODY DOES SOMETHING. KBLNK: .LNK KB,ERR  ;KEYBOARD LINK. TBUF: 14   ;MAX BYTES. 0   ;FORMATTED ASCII. 14   ;ACTUAL BYTES. .BYTE 15,12  ;CR AND LF. .ASCII /TRAN ERROR/ ;TEXT. .BYTE 15,12  ;CR AND LF. .EVEN INIT: .OPENI LINK3,FILE3 ;OPEN FILE3 FOR INPUT. MOV POINT2,R0  ;INIT OUTPUT BUFFER POINTER. MOV BUFF3+2,-(SP) ;SAVE ORIGINAL BUFF3 MODE. MOV #4,BUFF3+2  ;MAKE IT FORMATTED ASCII, ;NO ENTRY RETURN BR ENTRY3  ;ERROR RETURN SCAN: MOV #SCANTB,R1  ;SCAN TABLE IN R1 SCAN1: MOV #STABLE,R0  ;SORT TABLE IN R0 SCAN2: CMPB (R0),(R1)  ;LOOK FOR SCAN TABLE ENTRY BEQ ENTRY4  ;BRANCH IF FOUND TST (R0)+  ;BUMP SCAN TABLE POINTER BNE SCAN2  ;IF NOT ZERO,REENTER TSTB (R1)+  ;BUMP SCAN TABLE POINTER TSTB (R1)  ;TST FOR ZERO BNE SCAN1  ;CONTINUE IF NOT BR ENTRY5  ;BYPASS OPTION ENTRY4: JSR R5, WTPT  ;PRINT THE FOLLOWING .BYTE DIA4E-DIA41 LINK1 JSR R5,DELETE  ;DELETE FILE "TEMP2". FILE2 LINK2 BEGIN2: .INIT LINK3 .OPENI LINK3,FILE3 .OPENO LINK2,FILE2 .INIT LINK4  ;INIT LINK4 FOR LINE FEEDS. JSR R5,DELETE  ;DELETE FILE4 IF IT EXISTS. FILE4   ; LINK4   ; CLR R0 CLR R4 MOV #PAREN,-(SP) MOV POINT1,R3  ;WRITING BUFFFER MOVB #'/,(R3)+  ;LOAD IN FIRST DELIM. INC R4   ;BYTE COUNT REENT: MOV POINT3,R1  ;BIG BIG BUFFER JSR R5,READ3  ;READ IN DATA BUFF3 BNE DONE DUMP. CLR FLAG  ;CLEAR EOT FLAG. CLR INCNT  ;INIT INPUT BYTE COUNT FOR NXLINE. CLR NXLBF  ;CLEAR BEGINNING OF LINE FLAG. JSR PC,NXLINE  ;INITIALIZE NXLINE. CLR (PC)+  ;CLEAR THE LINE NUMBER. LINE: 0   ;CURRENT LINE NUMBER. INITA: JSR PC,NXLINE  ;GET THE NEXT LINE IN THE BUFFER. MOV #TABLE+2,R1  ;TABLE ADDRESS IN R1. INC LINE  ;NEXT LINE. MOV TABLE,R2  ;MAX BYTES FOR A LINE. INITB: CMP (R1),#-1  ;CHECK FOR END OF TABLE. BLO .+10  ;BR OVER IF NOT END ;BYTE COUNT DIA4: .ASCII /MONTH OPTION:/ .EVEN .WORD 5413 DIA4E: JSR PC, INPUT  ;GET INPUT FROM TTY. JSR R5,CKLDL  ;CHECK AND LOAD LETTERS 11. OPTION   ;ADDRESS OF LOAD BR .+6 BR ENTRY5  ;NO ENTRY RETURN BR ENTRY4  ;ERROR RETURN ENTRY5: JSR R5, WTPT .BYTE DIA5E-DIA5 ;BYTE COUNT DIA5: .ASCII /LIST:/ .EVEN .WORD 5413 DIA5E: JSR PC, INPUT  ;GET INPUT FROM TTY. JSR R5,CKLDL  ;CHECK AND LOAD LETTERS 16.   ;MAX ENTRIES LISTS   ;ADDRES ;GET/SORT/PRINT. ;GETS THE COLUMN INDICATED ;BY THE LETTER IN R4 FROM THE LINE ;INDICATED BY R5. ;DATA COMES FROM THE CONTIGUOUS FILE ;WHICH WAS GENERATED BY TRANS. ;ENTRY BY JSR PC, GET WITH THEMOV POINT3-2,R2  ;GET BYTE COUNT. RTS PC PAREN: CMPB #'(,(R1)+ BEQ LETRA PAREN1: DEC R2 BNE .+6 JSR PC, REENT BR PAREN LETRA: DEC R2 BNE .+6 JSR PC, REENT CMPB #'A,(R1)+ BNE PAREN1 MOVB #'(,(R3)+ SWAB R0 MOVB R0,(R3)+ SWAB R0 MOVB R0,(R3)+ MOVB #'),(R3)+ INC R0 ADD #4,R4 CMP #128.,R4 BGE PAREN1 MOV R4,BUFF1+4 JSR R5,WRITE2 BUFF1 MOV POINT1,R3 CLR R4 BR PAREN1 DONE: CLR (SP)+  ;CLEAR THE STACK. MOVB #'/,(R3)+ INC . MOV TABLE,R3  ;SET UP TO FILL IN LAST BLOCK. BR INITE  ;FILL IT IN. MOVB (R1)+,R4  ;GET LETTER OF NEXT COLUMN. CLR R3   ;CLEAR R3 FOR BYTE LOAD. BISB (R1)+,R3  ;MAX BYTES THIS COLUMN IN R3. JSR PC,GET  ;GET THE COLUMN FROM INPUT FILE. INITC: CMPB (R5),#40  ;IS THE CHAR A SPACE? BNE INITC1  ;GO TO INITC1 IF NOT. CMPB R3,-1(R1)  ;ELIMINATE LEADING SPACES. BEQ INITD  ;GO TO INITD IF LEADING SPACE. INITC1: JSR PC,TRAN  ;OUTPUT THE CHARACTER. DEC R2 S OF LOAD BR .+6   ;NORMAL RETURN BR ENTRY5  ;NO ENTRY RETURN BR ENTRY5  ;ERROR RETURN ENTRY6: JSR R5, WTPT  ;GET INPUT FROM TTY .BYTE DIA6E-DIA6 ;BYTE COUNT DIA6: .ASCII /COPIES:/ .EVEN .WORD 5413 DIA6E: JSR PC, INPUT  ;GET INPUT FROM TTY JSR R5,CKLDN  ;CHECK AND LOAD A NUMBER COPIES   ;ADDRESS OF LOAD BR .+6   ;NORMAL RETURN BR ENTRY6  ;NO ENTRY RETURN BR ENTRY6  ;ERROR RETURN .CLOSE KBLINK .CLOSE PTLINK .RLSE KBLINK .RLSE P LINE NUMBER ;IN R5 AND THE LETTER OF THE COLUMN ;REQUIRED IN R4. ;REGISTERS ARE SAVED. .REG .TITLE GET .GLOBL TRNR,TRNLNK,TRNFIL,TABLE,IMULT .GLOBL GET,SAVE,RESTOR,POINT3 .GLOBL TRA. 0   ;FILE INITIALIZED FLAG. MIN: 0   ;LOW LIMIT BLOCK OF TRNFIL. MAX: 0   ;HIGH LIMIT BLOCK OF TRNFIL. GET: TST GET-6  ;CHECK FOR INITIALIZATION. BNE GET1  ;GO TO GET1 IF ALREADY INITIALIZED. MOV PC,GET-6  ;SET INITIALIZED FLAG. .INIT TRNLNK  ;INIT DRIVER. R4 MOV R4,BUFF1+4 JSR R5, WRITE2 BUFF1 EXIT: .CLOSE LINK3 .CLOSE LINK2 EXEC: MOV #SRTABL,R1 EXEC1: TST (R1) BEQ PRINT MOV #SPECL,R2 CMP (R1),(R2)+ BEQ .+6 TST (R2)+ BR .-6 MOV (R2),R3 MOV (R1),-(R3) MOV R1,-(SP) JSR PC, OPTNS  ;TEST FOR MONTH ONLY OPTION. JSR PC, @(R2)+ JSR PC, SORT JSR R5,DELETE  ;DELETE FILE "TEMP1". FILE1   ; LINK1 MOV (SP)+,R1 JSR PC, LINFDS    ;DEC MAX BYTES/LINE. BLE INITA  ;NEW LINE IF ZERO. DEC R3   ;DEC MAX BYTES/COLUMN. BLE INITB  ;NEW COLUMN IF ZERO. BR .+4   ;BR OVER THE INC R5. INITD: INC R5   ;BUMP R5 TO NEXT CHARACTER. DEC R4   ;DEC INPUT BYTE COUNT. BGT INITC  ;INITC IF MORE LEFT. INITE: TST R3   ;OUTPUT FULL FOR THIS COLUMN? BLE INITB  ;INITB AND NEW COLUMN IF YES. MOV #SPA,R5  ;SET R5 TO SPACE ADDRESS. JSR PC,TRAN  ;OUTPUT THE CHARACTERS. DEC R2   ;DEC MAX BYTES/LTLINK LOADER: MOV 2(SP),R0  ;GET THE MINI-MON TABLE ADDRESS. MOV #STABLE,R1  ;GET YOUR OUN TABLE ADDRESS. MOV #43.,R2  ;SET A COUNTER. LOOP: MOV (R1)+,(R0)+  ;LOAD IT UP. DEC R2   ;DEC COUNTER BNE LOOP  ;LOOP TILL DONE. RTS PC   ;RETURN TO CALLER;LOOK OUT! SCANTB: .BYTE 'G .BYTE 'H .BYTE 'I .BYTE 'J .BYTE 'K .BYTE 'Z .BYTE 0 .EVEN INPUT: .READ KBLINK,KBBUFF .WAIT KBLINK RT.LOOK TRNLNK,TRNFIL, ;GET STATUS OF TRNFIL. MOV (SP),MIN  ;LOAD MIN WITH START BLOCK NUMBER. ADD (SP)+,(SP)  ;CALCULATE LAST BLOCK NUMBER. MOV (SP)+,MAX  ;LOAD MAX WITH IT. TSTB (SP)  ;SEE IF FILE EXISTS. BPL NOFILE  ;ERROR MESSAGE IF NOT. ROLB (SP)+  ;MAKE SURE IT IS CONTIGUOUS. BPL NOFILE  ;NOFILE MESSAGE IF NOT. MOV MIN,BLK  ;READ THE FIRST BLOCK MOV POINT3,BLK+2 ;OF THE FILE. JSR PC,GETR  ;THE FIRST WORD OF THE FIRST MOV @POINT3,(PC)+ ;BLOCK INDIC;TEST FOR LINE FEED OPTION TST (R1)+ BR EXEC1 .RLSE LINK1 .RLSE LINK2 .RLSE LINK3 .RLSE TRNLNK PRINT: .LOOK LINK4,FILE4 ;SEE IF LINK4 EXISTS. CLR (SP)+  ;CLEAR STACK AND CHECK STATUS. TSTB (SP)+  ; BMI .+4   ;BRANCH OVER IF IT EXISTS. RTS PC   ;RETURN TO MINI IF NOT. .OPENI LINK2,FILE2 ;OPEN FILE2 FOR READING. .OPENI LINK4,FILE4 ;OPEN FILE4 FOR READING. .OPENO LINK1,FILE1 ;OPEN FILE1 FOR WRITING. JSR PC,RED2  ;FIRST READ ON FILE2. JSR PC,RW41 INE. BLE INITA  ;NEW LINE IF ZERO. DEC R3   ;DEC MAX BYTES/COLUMN. BR INITE  ;LOOP. SPA: .BYTE 40  ;SPACE FOR FILL INS. ZERO: .BYTE 0   ;NULL FOR LAST BLOCK FILL IN. INITH: CMP R0,#BUFFB  ;MAKE SURE THAT THE LAST BEQ INITJ  ;BUFFER HAS BEEN WRITTEN. CMP R0,#BUFFB+200 ;FILL IN WITH NULLS THE LAST ONE. BEQ INITJ BHI .+10  ;BR OVER IF PRESENTLY IN 2ND BUFF. MOV #BUFFB,R2  ;GET BUFFB ADDRESS IN R2. BR .+6   ;BRANCH OVER. MOV #BUFFB+200,R2 ;GET 2ND BS PC WTPT: MOV #WBUFPT-2,R0 ;BYTE COUNT LOCATION MOVB (R5)+,(R0)  ;LOAD IN NUMBER OF BYTES TST (R0)+  ;BUMP HEADER POINTER MOV R5,(R0)  ;DUMP,LOAD BYTE ADDRESS ADD -(R0),R5  ;SET OFFSET FOR RETURN .WRITE PTLINK,PTBUFF RTS R5   ;RETURN PRENUM: .BYTE 200 .BYTE 57 .BYTE 72 .BYTE 60 .BYTE 15 .EVEN CKLDN: MOV RBUFPT,R1  ;GET BUFFER POINTER CLR R3   ;INIT ACCUM. CKLDN1: MOV #PRENUATES THE LAST LAST: 0   ;BLOCK WHICH CONTAINS DATA. BR GET1   ;GO TO GET1 WHEN INITIALIZATION DONE. NOFILE: .INIT KBLNK  ;INIT PRINTER LINK. .WRITE KBLNK,MSG1 ;WRITE THE ERROR MESSAGE. .WAIT KBLNK  ;WAIT FOR COMPLETION. .EXIT   ;RETURN TO THE MONITOR. KBLNK: .LNK KB,NOF  ;PRINTER LINK DATASET "NOF". MSG1: 12.   ;MAX BYTES. 0   ;FORMATTED ASCII. 12.   ;ACTUAL BYTES. .BYTE 15,12  ;CR AND LF. .ASCII /NO FILE!/ ;TEXT OF MESSAGE. .BYTE 15,12  ;CR ;FIRST READ ON FILE4. X1: CMPB (R0),#'/  ;IS CHARACTER A "/"? BNE .+4   ;BRANCH OVER IF NOT. MOVB (R0),(R4)+  ;LOAD IN OUTPUT BUFFER IF YES. CMPB (R0)+,#'(  ;IS IT A "("? BEQ X2   ;GOTO X2 IF YES. DEC R1   ;DEC FILE4 BUFFER BYTE COUNT. BGT X1   ;CONTINUE IF ANY DATA LEFT. JSR PC,RW4  ;WRITE OUTPUT BUF. AND READ ANOTHER BR X1   ;BUFFER FROM FILE4. X2: DEC R0   ;BUMP R0 BACK TO "(". CMPB (R2)+,#'(  ;LOOK FOR "(" IN FILE2. BEQ X3   ;GO TO XUFFER ADDRESS IN R2. MOV R0,R1  ;GET LAST BYTE ADDRESS IN R1. SUB R2,R1  ;GET OFFSETT OF LAST BYTE IN R1. ADD #200,R2  ;GET END OF BUF. ADDRESS. INITI: CLRB (R0)+  ;FILL IN WITH NULLS. CMP R0,R2  ;END OF BUF? BLO INITI  ;LOOP TILL YES. JSR PC,TRAN1  ;WRITE THE BUFFER. INITJ: MOV R0,-(SP)  ;WRITE THE 1ST WORD OF THE ADD #200,(SP)  ;1ST BLOCK WITH THE VALUE MOV TRNBLK,(R0)+ ;OF THE LAST BLOCK WHICH CONTAINS MOV R1,(R0)+  ;2ND WORD IS LAST BYTE OFFSET. M,R2  ;GET ADDRESS OF GARBAGE TABLE CLR R0   ;INIT R0 BISB (R1)+,R0  ;GET CHARACTER BICB (R2)+,R0  ;CLR PARITY CMPB (R2)+,R0  ;TST LOW LIMIT BGE EEXIT CMPB (R2)+,R0  ;TST HIGH LIMIT BLE EEXIT BICB (R2)+,R0  ;CLR #60 MOV R3,R4  ;STORE R3 ASL R3   ;SHIFT IT 4 TIMES ASL R3 ASL R3 ASL R4 ADD R4,R3  ;=TIMES 10. ADD R0,R3  ;=TIMES 10.+WHATEVER. CMPB (R2)+,(R1)  ;TST FOR CR BNE CKLDN1 MOV R3,@(R5)+  ;LOAD UP THE VALUE RTS R5   AND LF. .EVEN GET1: JSR R5,SAVE  ;SAVE THE REGISTERS. MOV 12(SP),R1  ;RETRIEVE LINE NUMBER (OLD R5 VALUE). BIC #100000,R1  ;NEW THING. MOV TABLE,R0  ;GET BYTES/LINE IN TRNFIL. JSR PC,IMULT  ;MULTIPLY LINE # BY BYTES/LINE. BCS GETE  ;GO TO GETE IF OVERFLOW OCCURED. MOV R0,R2  ;GET BYTE OFFSET FROM BEGINING OF BLOCK IN R2. BIC #177600,R2  ;CLEAR EXTRA. MOV #100,R3  ;DIVIDE RESULT FROM IMULT BY 128.. GET2: ROR R1   ;TO GET BLOCK OFFSET FROM ROR R0   3 WHEN FOUND. DEC R3   ;DEC FILE2 BUFFER BYTE COUNT. BGT X2+2  ;GO TO X2+2 IF ANY DATA LEFT. JSR PC,RED2  ;READ MORE IF NONE LEFT. BR X2+2   ;CONTINUE LOOKING FOR "(". X3: DEC R2   ;BUMP R2 BACK TO "(". MOV #4,R5  ;4 COUNT FOR FOUR BYTES. X4: MOVB (R2)+,(R4)+ ;MOVE LINE NUMBER INTO OUTPUT BUFFER. DEC R3   ;DEC FILE2 BUFFER BYTE COUNT. BGT .+6   ;BRANCH OVER IF ANY DATA LEFT. JSR PC,RED2  ;READ MORE. INC R0   ;BUMP R0 ONCE FOR EACH BYTE. DEC R1 MOV LINE,(R0)+  ;3RD WORD IS TOTAL NUMBER OF LINES. CLR (R0)+  ;DATA. CMP R0,(SP)  ;FILL IN THE REST WITH NULLS. BLO .-4   ;LOOP TILL FULL. CLR (SP)+  ;CLEAR THE STACK. SUB #200,R0  ;GET START OF BUFFER ADDRESS. MOV R0,CMA1  ;LOAD IT FOR JSR R5. JSR R5,TRNW  ;CALL TRAN ROUTINE. MIN: 0   ;SET TO 1ST BLOCK OF FILE. CMA1: 0   ;SET TO MEMORY ADDRESS. 100   ;WORD COUNT. CLR (SP)+  ;CLEAR THE STACK. .RLSE TRNLNK  ; MOV (SP)+,BUFF3+2 ;RESTORE OR ;NORMAL RETURN EEXIT: CMP (R5)+,(R5)+  ;BUMP TO NO ENTRY CMPB #15,R0  ;TST FOR CR BNE EEXIT1 RTS R5   ;NO ENTRY RETURN EEXIT1: TST (R5)+  ;BUMP TO ERROR RETURN RTS R5   ;ERROR RETURN PRECHA: .BYTE 200 .BYTE 100 .BYTE 133 .BYTE 15 .EVEN CKLDL: MOV RBUFPT,R1  ;GET BUFFER POINTER MOV RBUFPT-2,R2 ;GET BYTER COUNT CMP (;BEGINNING OF TRNFIL. ROR R3   ;LOOP EIGHT TIMES. BCC GET2  ; ADD MIN,R0  ;ADD OFFSET TO 1ST BLOCK NUMBER. INC R0   ;1ST BLOCK IS NOT DATA, SKIP IT. CMP R0,LAST  ;MAKE SURE COMPUTED BLOCK NUMBER BHI GETE  ;IS WITHIN THE FILE LIMITS. CMP R0,MIN  ; BLOS GETE  ;GO TO GETE IF OUT OR LIMITS. MOV R0,BLK  ;SET UP TO READ THE DATA. JSR PC,GETR  ;READ IT. ADD POINT3,R2  ;GET ADDRESS OF FIRST BYTE OF LINE. MOV #TABLE+2,R1  ;ADD IN BYTE LENGTHS FROM GET  ;DEC FILE4 BUFFER BYTE COUNT. BGT .+6   ;BRANCH OVER IF ANY DATA LEFT. JSR PC,RW4  ;WRITE FILE1 AND READ FILE4. DEC R5   ;MOVE ALL FOUR BYTES YET? BGT X4   ;CONTINUE IF NOT. BR X1   ;NEXT LINE NUMBER IF YES. RW4: MOV #POINT3-2,R0 ;CALCULATE BYTE COUNT AND MOV R4,(R0)+  ;SET R4 TO BEGINNING OF BUFFER 3. MOV (R0),R4  ; SUB R4,-(R0)  ; JSR R5,WRITE1  ;WRITE TO FILE1. BUFF3   ;FROM BUFFER THREE. RW41: JSR R5,READ4  ;READ FROM FILE4. BUFF1  IGINAL MODE. RTS PC   ;RETURN TO MINI-MON MAX: 0   ;SET TO LAST BLOCK OF FILE. TRAN: MOVB (R5)+,(R0)+ ;PUT CHARACTER IN THE BUFFER. CMP R0,#BUFFB+200 ;END OF BUFFER? BEQ TRAN1  ;TRAN1 IF END OF 1ST BUFFER. BHI TRAN3  ;TRAN3 CHECKS 2ND BUFFER. RTS PC   ;RETURN. TRAN1: MOV R0,CMA  ;LOAD MEMORY ADD. SUB #200,CMA  ;FOR JSR R5,TRNW. INC BLK   ;INC THE BLOCK #. CMP BLK,MAX  ;DON'T GO PAST THE END OF THE FILE. BHIS TRANE  ;ERROR IF PAST THE END. CMP BR5)+,R2  ;TST FOR MAX BYTES BLE EEXIT  ; CLR R0 BISB (R1),R0  ;SET UP FOR NO ENTRY. DEC R2   ;TST FOR NO ENTRY DEC R2 BEQ EEXIT  ; MOV (R5),R4  ;STORE POINTER IN R4 CKLDL1: MOV #PRECHA,R3  ;ADDRESS OF GARBAGE TABLE CLR R0 BISB (R1)+,R0  ;GET CHARACTER BICB (R3)+,R0  ;CLR PARITY CMPB (R3)+,R0  ;TST LOW LIMIT BGE EEXIT CMPB (R3)+,R0  ;TST HIGH LIMIT BLE EEXIT MOV R0,(R4)+  ;LOAD IN CHARACTER DEC R2   ;DEC BYTE COUNT BNE CKLDL1 3: CMPB (R1)+,R4  ;TABLE TO GET ADDRESS OF 1ST BYTE BEQ GET4  ;OF THE COLUMN OF INTEREST. BHI GETE  ;GO TO GETE IF COLUMN NOT FOUND. CLR R0   ;ADD IN THIS COLUMN OFFSET. BISB (R1)+,R0  ; ADD R0,R2  ; BR GET3   ;LOOP TILL THE LETTER OF INTEREST IF FOUND. GET4: CLR R0   ;GET BYTES FOR THIS COLUMN. BISB (R1),R0  ; MOV #DATA,R3  ;MOVE THE DATA INTO THE BUFFER MOV R0,(R3)+  ;AT DATA. 1ST WORD IS THE GET5: MOVB (R2)+,(R3)+ ;BYTE COUNT, FOLLOWED BY THE DA ;TO BUFFER # ONE. BNE RW43  ;GO TO RW43 IF NO MORE DATA. RW42: MOV #POINT1-2,R0 ;SET UP BUFFER POINTERS FOR FILE4. MOV (R0)+,R1  ;R1 IS FILE4 BUFFER BYTE COUNT. MOV (R0),R0  ;RO IS FILE4 BUFFER POINTER. MOV POINT3,R4  ;SET R4 TO BUFFER 3 1ST BYTE. RTS PC   ;RETURN. RW43: .CLOSE LINK1  ;CLOSE THE FILES WHEN FINISHED. .CLOSE LINK2  ; .CLOSE LINK4  ; JSR R5,DELETE  ;DELETE FILE2, TEMP.2 . FILE2   ; LINK2   ; JSR R5,DELETE  ;DELETE FILE4, TEMLK,MIN  ;CHECK LOW LIMIT. BLO TRANE  ;ERROR IF LOWER. JSR R5,TRNW  ;WRITE THE BUFFER. BLK: 0   ;SET TO BLOCK # TO WRITE. CMA: 0   ;SET TO MEMORY ADDRESS. 100   ;WORD COUNT. CMP R0,#BUFFB+200 ;CHECK FOR RESET TO BUFFER #1. BEQ TRAN2  ;RETURN IF NOT NEEDED. MOV #BUFFB,R0  ;RESET IF IF NEEDED. TRAN2: RTS PC   ;RETURN. TRANE: JMP TRANS3  ;PRINT ERROR MESSAGE. TRAN3: CMP R0,#BUFFB+400 ;END OF 2ND BUFFER? BLO TRAN2  ;RETURN IF NOT. BR TRAN1  ;WRITE TST (R5)+  ;BUMP TO RETURN ADDRESS. RTS R5   ;NORMAL RETURN STABLE: 0,0,0,0   ;SORT TABLE 0,0,0,0 0,0,0,0 0,0,0,0 FEEDS: 0   ;NUMBER OF LINE FEEDS COLUMN: 0   ;LINE FEED COLUMN OPTION: 0,0,0,0   ;MONTH OPTION COLUMNS 0,0,0,0 LISTS: 0,0,0,0   ;PRINT COLUMNS 0,0,0,0 0,0,0,0 0,0,0,0 COPIES: 0   ;NUMBER OF COPIES TA. DEC R0   ;DEC BYTE COUNT. BGT GET5  ;LOOP TILL ALL BYTES IN BUFFER. GET6: JSR R5,RESTOR  ;RESTOR THE REGISTERS. MOV #DATA,R5  ;GET BUFFER ADDRESS IN R5. RTS PC   ;RETURN TO CALLER. GETE: MOV #DATA,R5  ;RETURN FOUR Y'S IF COLUMN MOV #4,(R5)+  ;OR LINE COULD NOT BE LOCATED. MOV #"YY,(R5)+  ; MOV #"YY,(R5)+  ; BR GET6   ;RESTORE REGISTERS AND RETURN. GETR: JSR R5,TRNR  ;READ 2 BLOCKS FROM TRNFIL. BLK: 0   ;BLOCK NUMBER. 0   ;MEMORY ADDRESSP.4 . FILE4   ; LINK4   ; .RENAM LINK1,FILE1,FILE2;RENAME TEMP.1 TO TEMP.2 . CLR (SP)+  ;CLEAR THE STACK. RTS PC   ;RETURN TO MINI. RED2: JSR R5,READ2  ;READ FILE2 INTO BUFFER 2. BUFF2   ; MOV #POINT2,R3  ;SET UP POINTERS. MOV (R3),R2  ;R2 IS BUFFER POINTER. MOV -(R3),R3  ;R3 IS BYTE COUNT. RTS PC   ;RETURN. OPTNS: JSR R5,SAVE  ;SAVE REGISTERS. MOV #OPTION,R0  ;GET ADDRESS O IT IF YES. TRNFIL: .FIL FORMAT.CON  ;FILE NAME BLOCK. TRNW: .WAIT TRNLNK  ;WAIT FOR PREVIOUS MOV (R5)+,TRNBLK ;WRITE TO BE DONE, THEN SET UP MOV (R5)+,TRNBLK+2 ;NEW PARAMETERS. MOV (R5)+,TRNBLK+4 ; .TRAN TRNLNK,TRNBLK ;WRITE IT. RTS R5   ;RETURN. TRNLNK: .LNK DF   ;TRAN LINKBLOCK. TRNBLK: 0   ;BLOCK NUMBER. 0   ;MEMORY ADDRESS. 0   ;NUMBER OF WORDS. 3   ;FUNCTION/STATUS. 0   ;WORD NOT TRANSFERED. NXLINE: TST FLAG  ;TST EOD FLAG. .WORD 0 KBLINK: .WORD 0 .RAD50 /XXX/ .BYTE 1,0 .RAD50 /KB/ .WORD 0 .WORD 0 KBFILE: .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 KBBUFF: .WORD 128. .BYTE 4,0 .WORD 0 RBUFPT: .WORD BUFFA .WORD 0 PTLINK: .WORD 0 .RAD50 /YYY/ .BYTE 1,0 .RAD50 /KB/ .WORD 0 .WORD 0 PTFILE: .WORD 0 .WORD 0 .WORD 0 .WORD 0 .WORD 0 PTBUFF: .WORD 128. .BYTE 4,0 .WORD 0 WBUFPT: .WORD BUFFB BUFFA: .=.+128. BUFFB: .=.+128. ;O,SET AT INITIALIZATION. 200   ;WORD COUNT. RTS PC   ;RETURN. DATA: .=.+40.   ;DATA BUFFER. .END F OPTION WORD. MOV #8.,R2  ;SET AN 8 COUNTER. OPTNS1: CMP (R1),(R0)+  ;TEST FOR OPTION CHARACTER. BEQ OPTNS2  ;BRANCH IF REQUIRED. DEC R2   ;TEST FOR DONE. BNE OPTNS1  ;BRANCH IF DONE. CLR SWTCH4  ;CLEAR SWITCH IN FORM4. BR OPTNS3  ;GO TO EXIT OPTNS2: INC SWTCH4  ;SET SWITCH IN FORM4 OPTNS3: JSR R5,RESTOR  ;RESTORE REGISTERS RTS PC   ;RETURN TO CALLER LINFDS: JSR R5,SAVE  ;SAVE REGISTERBEQ .+10  ;BRANCH OVER IF NO EOD. CLR (SP)+  ;CLEAR STACK OF RET. FOR JSR NXLINE. JMP INITH  ;FINISH TRANSFER AND EXIT. JSR R5,SAVE  ;SAVE THE REGISTERS. MOV POINT1,R0  ;LINE BUFFER START ADDRESS. MOV #NXLBF,R1  ;GET (A) IN BUF. TST (R1)  ;SKIP IF NO (A) YET. BEQ .+10  ; MOVB (R1)+,(R0)+ ;MOVE THE DATA. BNE .-2   ;LOOP TILL NULL BYTE IS FOUND. DEC R0   ;ELIMINATE IT. MOV INPNT,R1  ;GET INPUT POINTER. MOV INCNT,R2  ;GET BYTES LEFT. BGT NXLNVL DRIVER OVL: .INIT LINKX .LOOK LINKX,FILEX TST (SP)+ TSTB (SP)+ BPL OVL1 .DELETE LINKX,FILEX OVL1: .OPENO LINKX,FILEX .WRITE LINKX,BUFFX .WAIT LINKX .CLOSE LINKX .RLSE LINKX EMT 60 .WORD 0 LINKX: .WORD 0 .RAD50 /CAT/ .BYTE 1,0 .RAD50 /DF/ .WORD 0 .BYTE 0,0 FILEX: .RAD50 /EXE/ .RAD50 /C/ .RAD50 /OVL/ .BYTE 1,1 .WORD 0 BUFFX: .WORD OVL-17000 .BYTE 7,0 .WORD OVL-17000 .WORD 17000 .END OVL ;TRANS/SORT/PRINT ;THIS ROUTINE IS USED TO READ A LINKED ;FILE (FILE3) AND CREATE FROM IT A ;CONTIGUOUS FILE. ;ENTERED BS. CMP (R1),COLUMN  ;TEST FOR REQUIREMENT. BNE LINOUT  ;BR IF NOT REQUIRED. .OPENI LINK2,FILE2 .OPENO LINK1,FILE1 LINRDS: JSR R5,READ2  ;READ TEMP2 BUFF2 BNE LINDUN JSR R5,WRITE1  ;WRITE FILE1. BUFF2   ;FROM BUFFER TWO. BR LINRDS  ;CONTINUE. LINDUN: .CLOSE LINK1 .CLOSE LINK2 .RENAM LINK1,FILE1,FILE4 LINOUT: JSR R5,RESTOR RTS PC   ;RETURN TO CALLER. DELETE: .LOOK @(R5)+,@(R5)+2  ;GO TO NXLN2 IF ANY LEFT. NXLN1: JSR PC,READ  ;GET A LINE. NXLN2: MOVB (R1)+,(R0)  ;GET A CHARACTER. BEQ NXLN3  ;IGNOR NULLS. CMPB (R0)+,#'(  ;LOOK FOR "(". BEQ NXLN4  ;GO TO NXLN4 IF FOUND. NXLN3: JSR PC,TST1  ;CHECK FOR END OF BUFFER. BR NXLN2  ;CONTINUE. NXLN4: JSR PC,TST1  ;CHK BUFFER. MOV #NXLBF,R3  ;GET TEMP BUFFER ADDRESS. MOVB -(R0),(R3)+ ;MOVE IN THE (. MOVB (R1)+,(R3)  ;GET THE NEXT CHAR. CMPB (R3)+,#'A  ;IS IT AN A. BNE NXLN5  ;GY JSR PC. ;THE FILE BLOCK FOR FILE3 IS INITED ;PRIOR TO CALLING TRANS. .REG .TITLE TRANS .GLOBL TRA.,LINK3,FILE3,TABLE,SAVE,RESTOR .GLOBL READ3,BUFF3,POINT2,BUFFB .GLOBL POINT3,BUFF1,POINT1 TRANS: .INIT TRNLNK  ;INIT THE TRNLNK DEVICE. .INIT LINK3  ;INIT THE LINK3 DEVICE. .STAT LINK3  ;GET DEVICE FACILITY WORD AT STAT3. MOV (SP)+,STAT3  ;REFERENCED TO SEE IF FILE3 CMP (SP)+,(SP)+  ;DEVICE IS FILE STRUCTURED. TRANS1: .LOOK TRNLNK,TRNFIL, ;SEE IF THE CONTI TST (SP)+  ;BUMP OUT OF WAY. TSTB (SP)+  ;LOOK FOR THE MACHINE. BPL DEL1  ;BR IF FOUND. CMP -(R5),-(R5)  ;BUMP POINTERS. .DELETE @(R5)+,@(R5)+ DEL1: RTS R5   ;RETURN TO CALLER. FORMX: RTS PC   ;FAKE ROUTINE  SRTABL: 0,0,0,0 0,0,0,0 0,0,0,0 0,0,0,0 FEEDS: 0 COLUMN: 0 OPTION: 0,0,0,0 0,0,0,0 SPECL: 'A FORM2 'B FORM1 'C FORM1 'D FORM1 'E FORM3 'F O TO NXLN5 IF NOT. JSR PC,TST1  ;CHECK BUFFER. MOVB (R1)+,(R3)  ;GET NEXT CHARACTER. CMPB (R3)+,#') ;IS IT AN )? BEQ NXLN6  ;GO TO NXLN6 IF YES. NXLN5: MOV #NXLBF,R4  ;NOT AN A, PUT DATA IN OUTPUT BUFFER. MOVB (R4)+,(R0)+ ; CMP R4,R3  ;LOOP TILL R4 EQUALS R3. BLO .-4   ; CLR NXLBF  ;CLEAR FOR FLAG. BR NXLN3  ;GET SOME MORE DATA. NXLN6: CLRB (R3)  ;NULL TERMINATOR. DEC R2   ;DEC INPUT BYTE COUNT. MOV R1,INPNT  ;UPDATE POINTERS. MOV R2,INCN ;GET/SORT/PGUOUS FILE MOV (SP),MIN  ;EXISTS AND SET UP POINTERS ADD (SP)+,(SP)  ;IF IT DOES. MOV (SP)+,MAX  ;MAX HOLDS LAST BLOCK ADD. TSTB (SP)  ;DOES IT EXIST? BPL TRANS2  ;GO TO TRANS2 IF NOT. ROLB (SP)+  ;IS IT CONTIGUOUS IF EXISTENT? BPL TRANS3  ;GO TO TRANS3 IF NOT. MOV MIN,BLK  ;INITIALIZE TRANSFER POINTER BR INIT   ;START THE TRANSFER. TRANS2: CLR (SP)+  ;CLEAR THE STACK. .ALLOC TRNLNK,TRNFIL,1000. ;ALLOCATE THE FILE. INC (SP)+  ;ALLOCATED OK? BEQFORM3 'G FORM4 'H FORM4 'I FORM4 'J FORM4 'K FORM4 'L FORM2 'M FORM2 'N FORMX 'O FORMX 'P FORMX 'Q FORMX 'R FORMX 'S FORMX 'T FORMX 'U FORMX 'V FORMX 'W FORMX 'X FORMX 'Y FORMX 'Z FORM4  .END T  ; MOV R0,LEND  ;END OF DATA POINTER. JSR R5,RESTOR  ;RESTORE THE REGISTERS. RTS PC   ;RETURN. TST1: DEC R2   ;DEC INPUT BYTE COUNT. BLE READ  ;GO TO READ IF 0. RTS PC   ;RETURN IN ANY LEFT. READ: TST FLAG  ;CHECK FOR PREVIOUS EOD. BNE RED4  ;GO TO RED4 IF THERE HAS BEEN ONE. JSR R5,READ3  ;READ IN A BUFFER. BUFF3   ;INTO BUFFER #3. BNE RED3  ;GO TO RED3 IF EOT. RED1: MOV POINT3,R1  ;SET R1 TO 1ST BYTE OF DATA. MOV POINT3-2,R2  ;R2 IS BRINT. ;GETS THE COLUMN INDICATED ;BY THE LETTER IN R4 FROM THE LINE ;INDICATED BY R5. ;DATA COMES FROM THE CONTIGUOUS FILE ;WHICH WAS GENERATED BY TRANS. ;ENTRY BY JSR PC, GET WITH THE LINE NUMBER ;IN R5 AND THE LETTER OF THE COLUMN ;REQUIRED IN R4. ;REGISTERS ARE SAVED. .REG .TITLE GET .GLOBL TRNR,TRNLNK,TRNFIL,TABLE,IMULT .GLOBL GET,SAVE,RESTOR,POINT3 .GLOBL TRA. 0   ;FILE INITIALIZED FLAG. MIN: 0   ;LOW LIMIT BLOCK OF TRNFIL. MAX: 0   ;H TRANS1  ;GO TO TRANS1 IF YES. TRANS3: .INIT KBLNK  ;PRINT ERROR MESSAGE IF NOT. .WRITE KBLNK,TBUF ;WRITE THE MESSAGE. BR .   ;HANG HERE TILL SOMEBODY DOES SOMETHING. KBLNK: .LNK KB,ERR  ;KEYBOARD LINK. TBUF: 14   ;MAX BYTES. 0   ;FORMATTED ASCII. 14   ;ACTUAL BYTES. .BYTE 15,12  ;CR AND LF. .ASCII /TRAN ERROR/ ;TEXT. .BYTE 15,12  ;CR AND LF. .EVEN INIT: .OPENI LINK3,FILE3 ;OPEN FILE3 FOR INPUT. MOV POINT2,R0  ;INIT OUTPUT BUFFER POINTER. MOYTE COUNT. BEQ RED3  ;GO TO RED3 IF BYTE CNT IS 0. CLR (PC)+  ;CLEAR EOD FLAG. FLAG: 0   ;EOD FLAG. RTS PC   ;RETURN. RED2: MOV PC,FLAG  ;SET EOD FLAG. MOV R0,LEND  ;SET END OF DATA WORD. CLR (SP)+  ;CLEAR STACT OF RET FOR JSR READ. JSR R5,RESTOR  ;RESTORE THE REGISTER. RTS PC   ;RETURN TO CALLER OF NXLINE. RED3: .CLOSE LINK3  ;CLOSE INPUT FILE. .RLSE LINK3  ;RESEASE INPUT DEVICE. TST (PC)+  ;SEE IF FILE3 DEVICE IS FILE STRUCTURED. STAT3: 0  IGH LIMIT BLOCK OF TRNFIL. GET: TST GET-6  ;CHECK FOR INITIALIZATION. BNE GET1  ;GO TO GET1 IF ALREADY INITIALIZED. MOV PC,GET-6  ;SET INITIALIZED FLAG. .INIT TRNLNK  ;INIT DRIVER. .LOOK TRNLNK,TRNFIL, ;GET STATUS OF TRNFIL. MOV (SP),MIN  ;LOAD MIN WITH START BLOCK NUMBER. ADD (SP)+,(SP)  ;CALCULATE LAST BLOCK NUMBER. MOV (SP)+,MAX  ;LOAD MAX WITH IT. TSTB (SP)  ;SEE IF FILE EXISTS. BPL NOFILE  ;ERROR MESSAGE IF NOT. ROLB (SP)+  ;MAKE SURE IT IS CONTIGUV BUFF3+2,-(SP) ;SAVE ORIGINAL BUFF3 MODE. MOV #4,BUFF3+2  ;MAKE IT FORMATTED ASCII, DUMP. CLR FLAG  ;CLEAR EOT FLAG. CLR INCNT  ;INIT INPUT BYTE COUNT FOR NXLINE. CLR NXLBF  ;CLEAR BEGINNING OF LINE FLAG. JSR PC,NXLINE  ;INITIALIZE NXLINE. CLR (PC)+  ;CLEAR THE LINE NUMBER. LINE: 0   ;CURRENT LINE NUMBER. INITA: JSR PC,NXLINE  ;GET THE NEXT LINE IN THE BUFFER. MOV #TABLE+2,R1  ;TABLE ADDRESS IN R1. INC LINE  ;NEXT LINE. MOV TABLE,R2  ;MAX BYTES FOR A ;TRANS/SORT/PRINT ;THIS ROUTINE IS USED TO READ A LINKED ;FILE (FILE3) AND CREATE FROM IT A ;CONTIGUOUS FILE. ;ENTERED BY JSR PC. ;THE FILE BLOCK FOR FILE3 IS INITED ;PRIOR TO CALLING TRANS. .REG .TITLE TRANS .GLOBL TRA.,LINK3,FILE3,TABLE,SAVE,RESTOR .GLOBL READ3,BUFF3,POINT2,BUFFB ;INDICATOR WORD. BPL RED5  ;MINUS IS FILE STRUCTURED. BR RED2   ;GO TO RED2 IF FILE STRUCTURED. RED4: CLR (SP)+  ;CLEAR STACK OF RET. FOR JSR READ. JSR R5,RESTOR  ;RESTORE THE REGISTERS. CLR (SP)+  ;CLR STACK OF RET. FOR JSR NXLINE. JMP INITH  ;COMPLETE OUTPUT FILE AND EXIT. RED5: .INIT KBLNK  ;PRINT END? .WRITE KBLNK,ENBF ; .WAIT KBLNK  ;WAIT FOR OUTPUT. .READ KBLNK,BUF  ;WAIT FOR OPERATOR ACTION. .WAIT KBLNK  ; .INIT LINK3  ;INIT INPUT DEVICE. OUS. BPL NOFILE  ;NOFILE MESSAGE IF NOT. MOV MIN,BLK  ;READ THE FIRST BLOCK MOV POINT3,BLK+2 ;OF THE FILE. JSR PC,GETR  ;THE FIRST WORD OF THE FIRST MOV @POINT3,(PC)+ ;BLOCK INDICATES THE LAST LAST: 0   ;BLOCK WHICH CONTAINS DATA. BR GET1   ;GO TO GET1 WHEN INITIALIZATION DONE. NOFILE: .INIT KBLNK  ;INIT PRINTER LINK. .WRITE KBLNK,MSG1 ;WRITE THE ERROR MESSAGE. .WAIT KBLNK  ;WAIT FOR COMPLETION. .EXIT   ;RETURN TO THE MONITOR. KBLNK: .LNK KB,NOF  ;P LINE. INITB: CMP (R1),#-1  ;CHECK FOR END OF TABLE. BLO .+10  ;BR OVER IF NOT END. MOV TABLE,R3  ;SET UP TO FILL IN LAST BLOCK. BR INITE  ;FILL IT IN. MOVB (R1)+,R4  ;GET LETTER OF NEXT COLUMN. CLR R3   ;CLEAR R3 FOR BYTE LOAD. BISB (R1)+,R3  ;MAX BYTES THIS COLUMN IN R3. JSR PC,GET  ;GET THE COLUMN FROM INPUT FILE. INITC: CMPB (R5),#40  ;IS THE CHAR A SPACE? BNE INITC1  ;GO TO INITC1 IF NOT. CMPB R3,-1(R1)  ;ELIMINATE LEADING SPACES. BEQ INITD  .GLOBL POINT3,BUFF1,POINT1 TRANS: .INIT TRNLNK  ;INIT THE TRNLNK DEVICE. .INIT LINK3  ;INIT THE LINK3 DEVICE. .STAT LINK3  ;GET DEVICE FACILITY WORD AT STAT3. MOV (SP)+,STAT3  ;REFERENCED TO SEE IF FILE3 CMP (SP)+,(SP)+  ;DEVICE IS FILE STRUCTURED. TRANS1: .LOOK TRNLNK,TRNFIL, ;SEE IF THE CONTIGUOUS FILE MOV (SP),MIN  ;EXISTS AND SET UP POINTERS ADD (SP)+,(SP)  ;IF IT DOES. MOV (SP)+,MAX  ;MAX HOLDS LAST BLOCK ADD. TSTB (SP)  ;DOES IT EXIST? BPL TRANS .OPENI LINK3,FILE3 ;OPEN INPUT FILE. JSR R5,READ3  ;ATTEMPT TO READ ANOTHER BUFFER. BUFF3   ;BUFFER #3. BNE RED2  ;TERMINATE IF ANOTHER EOD. TST POINT3-2  ;LOOK FOR 0 BYTE COUNT. BEQ RED2  ;TERMINATE IF 0. BR RED1   ;CONTINUE IF NOT. ENBF: 10   ;MAX BYTES. 0   ;FORMATTED ASCII. 10   ;ACTUALL BYTES. .BYTE 15,12  ;CR AND LF. .ASCII /END?/  ;TEXT. .BYTE 15,12  ;CR AND LF. .EVEN BUF: 1   ;MAX BYTES. 2   ;UNFORMATTED ASCII. 1 RINTER LINK DATASET "NOF". MSG1: 12.   ;MAX BYTES. 0   ;FORMATTED ASCII. 12.   ;ACTUAL BYTES. .BYTE 15,12  ;CR AND LF. .ASCII /NO FILE!/ ;TEXT OF MESSAGE. .BYTE 15,12  ;CR AND LF. .EVEN GET1: JSR R5,SAVE  ;SAVE THE REGISTERS. MOV 12(SP),R1  ;RETRIEVE LINE NUMBER (OLD R5 VALUE). MOV TABLE,R0  ;GET BYTES/LINE IN TRNFIL. JSR PC,IMULT  ;MULTIPLY LINE # BY BYTES/LINE. BCS GETE  ;GO TO GETE IF OVERFLOW OCCURED. MOV R0,R2  ;GET BYTE OFFSET FROM BEGIN;GO TO INITD IF LEADING SPACE. INITC1: JSR PC,TRAN  ;OUTPUT THE CHARACTER. DEC R2   ;DEC MAX BYTES/LINE. BLE INITA  ;NEW LINE IF ZERO. DEC R3   ;DEC MAX BYTES/COLUMN. BLE INITB  ;NEW COLUMN IF ZERO. BR .+4   ;BR OVER THE INC R5. INITD: INC R5   ;BUMP R5 TO NEXT CHARACTER. DEC R4   ;DEC INPUT BYTE COUNT. BGT INITC  ;INITC IF MORE LEFT. INITE: TST R3   ;OUTPUT FULL FOR THIS COLUMN? BLE INITB  ;INITB AND NEW COLUMN IF YES. MOV #SPA,R5  ;SET R5 2  ;GO TO TRANS2 IF NOT. ROLB (SP)+  ;IS IT CONTIGUOUS IF EXISTENT? BPL TRANS3  ;GO TO TRANS3 IF NOT. MOV MIN,BLK  ;INITIALIZE TRANSFER POINTER BR INIT   ;START THE TRANSFER. TRANS2: CLR (SP)+  ;CLEAR THE STACK. .ALLOC TRNLNK,TRNFIL,1000. ;ALLOCATE THE FILE. INC (SP)+  ;ALLOCATED OK? BEQ TRANS1  ;GO TO TRANS1 IF YES. TRANS3: .INIT KBLNK  ;PRINT ERROR MESSAGE IF NOT. .WRITE KBLNK,TBUF ;WRITE THE MESSAGE. BR .   ;HANG HERE TILL SOMEBODY DOES SOMETHING.   ;ACTUAL. 0   ;BUFFER. GET: MOV POINT1,R5  ;BEGINNING OF LINE. GET1: CMPB (R5)+,#'(  ;LOOK FOR (. BEQ GET4  ;GO TO GET4 IF IT IS ONE. GET2: CMP R5,LEND  ;CHECK FOR END OF LINE. BLO GET1  ;CONTINUE LOOKING IF NOT END. GET3: MOV #XX,R5  ;SEND FOUR X'S IF COLUMN NOT FOUND. MOV #4,R4  ;BYTE COUNT. RTS PC   ;RETURN. GET4: CMP R5,LEND  ;CHECK FOR END OF LINE. BHIS GET3  ;NO FIND IF PAST END. CMPB (R5)+,R4  ;IS THIS THE CHARACTER OF INTEREST? BNEING OF BLOCK IN R2. BIC #177600,R2  ;CLEAR EXTRA. MOV #100,R3  ;DIVIDE RESULT FROM IMULT BY 128.. GET2: ROR R1   ;TO GET BLOCK OFFSET FROM ROR R0   ;BEGINNING OF TRNFIL. ROR R3   ;LOOP EIGHT TIMES. BCC GET2  ; ADD MIN,R0  ;ADD OFFSET TO 1ST BLOCK NUMBER. INC R0   ;1ST BLOCK IS NOT DATA, SKIP IT. CMP R0,LAST  ;MAKE SURE COMPUTED BLOCK NUMBER BHI GETE  ;IS WITHIN THE FILE LIMITS. CMP R0,MIN  ; BLOS GETE  ;GO TO GETE IF OUT OR LIMITS. MOV R0,BTO SPACE ADDRESS. JSR PC,TRAN  ;OUTPUT THE CHARACTERS. DEC R2   ;DEC MAX BYTES/LINE. BLE INITA  ;NEW LINE IF ZERO. DEC R3   ;DEC MAX BYTES/COLUMN. BR INITE  ;LOOP. SPA: .BYTE 40  ;SPACE FOR FILL INS. ZERO: .BYTE 0   ;NULL FOR LAST BLOCK FILL IN. INITH: CMP R0,#BUFFB  ;MAKE SURE THAT THE LAST BEQ INITJ  ;BUFFER HAS BEEN WRITTEN. CMP R0,#BUFFB+200 ;FILL IN WITH NULLS THE LAST ONE. BEQ INITJ BHI .+10  ;BR OVER IF PRESENTLY IN 2ND BUFF. MOV #BUFFB,R2 KBLNK: .LNK KB,ERR  ;KEYBOARD LINK. TBUF: 14   ;MAX BYTES. 0   ;FORMATTED ASCII. 14   ;ACTUAL BYTES. .BYTE 15,12  ;CR AND LF. .ASCII /TRAN ERROR/ ;TEXT. .BYTE 15,12  ;CR AND LF. .EVEN INIT: .OPENI LINK3,FILE3 ;OPEN FILE3 FOR INPUT. MOV POINT2,R0  ;INIT OUTPUT BUFFER POINTER. MOV BUFF3+2,-(SP) ;SAVE ORIGINAL BUFF3 MODE. MOV #4,BUFF3+2  ;MAKE IT FORMATTED ASCII, DUMP. CLR FLAG  ;CLEAR EOT FLAG. CLR INCNT  ;INIT INPUT BYTE COUNT FOR NXLINE.  GET2  ;CONTINUE IF NOT. INC R5   ;INC ADDRESS IF YES. CMP R5,LEND  ;CHECK FOR LINE END. BHIS GET3  ;XX'S IF END. MOV R5,R4  ;SAVE BEGINNING ADDRESS. GET5: CMPB (R4)+,#'(  ;FIND END OF COLUMN. BEQ GET6  ;GO TO GET6 WHEN FOUND. CMP R4,LEND  ;END OF LINE IS ALSO END OF COLUMN. BLO GET5  ;LOOP TILL END OF COLUMN. GET6: DEC R4   ;BUMP R4 TO LAST CHAR. BEFORE THE "(". SUB R5,R4  ;GET BYTE COUNT IN R4. RTS PC   ;RETURN. INCNT: 0   ;INPUT BYTE COUNLK  ;SET UP TO READ THE DATA. JSR PC,GETR  ;READ IT. ADD POINT3,R2  ;GET ADDRESS OF FIRST BYTE OF LINE. MOV #TABLE+2,R1  ;ADD IN BYTE LENGTHS FROM GET3: CMPB (R1)+,R4  ;TABLE TO GET ADDRESS OF 1ST BYTE BEQ GET4  ;OF THE COLUMN OF INTEREST. BHI GETE  ;GO TO GETE IF COLUMN NOT FOUND. CLR R0   ;ADD IN THIS COLUMN OFFSET. BISB (R1)+,R0  ; ADD R0,R2  ; BR GET3   ;LOOP TILL THE LETTER OF INTEREST IF FOUND. GET4: CLR R0   ;GET BYTES FOR THIS COLUMN. BI  ;GET BUFFB ADDRESS IN R2. BR .+6   ;BRANCH OVER. MOV #BUFFB+200,R2 ;GET 2ND BUFFER ADDRESS IN R2. MOV R0,R1  ;GET LAST BYTE ADDRESS IN R1. SUB R2,R1  ;GET OFFSETT OF LAST BYTE IN R1. ADD #200,R2  ;GET END OF BUF. ADDRESS. INITI: CLRB (R0)+  ;FILL IN WITH NULLS. CMP R0,R2  ;END OF BUF? BLO INITI  ;LOOP TILL YES. JSR PC,TRAN1  ;WRITE THE BUFFER. INITJ: MOV R0,-(SP)  ;WRITE THE 1ST WORD OF THE ADD #200,(SP)  ;1ST BLOCK WITH THE VALUE MOV TRNBLK,(R0CLR NXLBF  ;CLEAR BEGINNING OF LINE FLAG. JSR PC,NXLINE  ;INITIALIZE NXLINE. CLR (PC)+  ;CLEAR THE LINE NUMBER. LINE: 0   ;CURRENT LINE NUMBER. INITA: JSR PC,NXLINE  ;GET THE NEXT LINE IN THE BUFFER. MOV #TABLE+2,R1  ;TABLE ADDRESS IN R1. INC LINE  ;NEXT LINE. MOV TABLE,R2  ;MAX BYTES FOR A LINE. INITB: CMP (R1),#-1  ;CHECK FOR END OF TABLE. BLO .+10  ;BR OVER IF NOT END. MOV TABLE,R3  ;SET UP TO FILL IN LAST BLOCK. BR INITE  ;FILL IT IN. MOVB (R1) T AT EXIT. INPNT: 0   ;INPUT POINTER AT EXIT. LEND: 0   ;END OF LINE POINTER. XX: "XX,"XX   ;FOUR X'S FOR NO COLUMN FIND. NXLBF: 0,0,0,0,0,0,0  ;TEMP BUFFER FOR END OF LINE FIND. .END SB (R1),R0  ; MOV #DATA,R3  ;MOVE THE DATA INTO THE BUFFER MOV R0,(R3)+  ;AT DATA. 1ST WORD IS THE GET5: MOVB (R2)+,(R3)+ ;BYTE COUNT, FOLLOWED BY THE DATA. DEC R0   ;DEC BYTE COUNT. BGT GET5  ;LOOP TILL ALL BYTES IN BUFFER. GET6: JSR R5,RESTOR  ;RESTOR THE REGISTERS. MOV #DATA,R5  ;GET BUFFER ADDRESS IN R5. RTS PC   ;RETURN TO CALLER. GETE: MOV #DATA,R5  ;RETURN FOUR Y'S IF COLUMN MOV #4,(R5)+  ;OR LINE COULD NOT BE LOCATED. MOV #"YY,(R5)+  ; MOV )+ ;OF THE LAST BLOCK WHICH CONTAINS MOV R1,(R0)+  ;2ND WORD IS LAST BYTE OFFSET. MOV LINE,(R0)+  ;3RD WORD IS TOTAL NUMBER OF LINES. CLR (R0)+  ;DATA. CMP R0,(SP)  ;FILL IN THE REST WITH NULLS. BLO .-4   ;LOOP TILL FULL. CLR (SP)+  ;CLEAR THE STACK. SUB #200,R0  ;GET START OF BUFFER ADDRESS. MOV R0,CMA1  ;LOAD IT FOR JSR R5. JSR R5,TRNW  ;CALL TRAN ROUTINE. MIN: 0   ;SET TO 1ST BLOCK OF FILE. CMA1: 0   ;SET TO MEMORY ADDRESS. 100   ;WORD COUN +,R4  ;GET LETTER OF NEXT COLUMN. CLR R3   ;CLEAR R3 FOR BYTE LOAD. BISB (R1)+,R3  ;MAX BYTES THIS COLUMN IN R3. JSR PC,GET  ;GET THE COLUMN FROM INPUT FILE. INITC: CMPB (R5),#40  ;IS THE CHAR A SPACE? BNE INITC1  ;GO TO INITC1 IF NOT. CMPB R3,-1(R1)  ;ELIMINATE LEADING SPACES. BEQ INITD  ;GO TO INITD IF LEADING SPACE. INITC1: JSR PC,TRAN  ;OUTPUT THE CHARACTER. DEC R2   ;DEC MAX BYTES/LINE. BLE INITA  ;NEW LINE IF ZERO. DEC R3   ;DEC MAX BYTES/C#"YY,(R5)+  ; BR GET6   ;RESTORE REGISTERS AND RETURN. GETR: JSR R5,TRNR  ;READ 2 BLOCKS FROM TRNFIL. BLK: 0   ;BLOCK NUMBER. 0   ;MEMORY ADDRESS,SET AT INITIALIZATION. 200   ;WORD COUNT. RTS PC   ;RETURN. DATA: .=.+40.   ;DATA BUFFER. .END T. .RLSE TRNLNK  ; MOV (SP)+,BUFF3+2 ;RESTORE ORIGINAL MODE. RTS PC   ;RETURN TO MINI-MON MAX: 0   ;SET TO LAST BLOCK OF FILE. TRAN: MOVB (R5)+,(R0)+ ;PUT CHARACTER IN THE BUFFER. CMP R0,#BUFFB+200 ;END OF BUFFER? BEQ TRAN1  ;TRAN1 IF END OF 1ST BUFFER. BHI TRAN3  ;TRAN3 CHECKS 2ND BUFFER. RTS PC   ;RETURN. TRAN1: MOV R0,CMA  ;LOAD MEMORY ADD. SUB #200,CMA  ;FOR JSR R5,TRNW. INC BLK   ;INC THE BLOCK #. CMP BLK,MAX  ;DON'T GO PAST THE END OF THOLUMN. BLE INITB  ;NEW COLUMN IF ZERO. BR .+4   ;BR OVER THE INC R5. INITD: INC R5   ;BUMP R5 TO NEXT CHARACTER. DEC R4   ;DEC INPUT BYTE COUNT. BGT INITC  ;INITC IF MORE LEFT. INITE: TST R3   ;OUTPUT FULL FOR THIS COLUMN? BLE INITB  ;INITB AND NEW COLUMN IF YES. MOV #SPA,R5  ;SET R5 TO SPACE ADDRESS. JSR PC,TRAN  ;OUTPUT THE CHARACTERS. DEC R2   ;DEC MAX BYTES/LINE. BLE INITA  ;NEW LINE IF ZERO. DEC R3   ;DEC MAX BYTES/COLUMN. BR INITE   ^ys(E;Mhysh^yshysh~h6(^W@@y:}@^y:}(\y:}hW@hPys@ny@nE;M@nX*@nO p:@nfO p:(X; 9 ;IOX/SORT/PRINT. ;TRANSFER ROUTINES USED BY SORT AND PRINT. .REG .TITLE IOXN .GLOBL TRNR,TRNW,TRNLNK,TRNFIL TRNLNK: .LNK DF,TRN  ;TRAN LINKBLOCK. TRNFIL: .FIL FORMAT.CON  ;TRAN FILE BLOCK. TRNR: MOV (R5)+,TRBLKR ;LOAD PARAMETERS IN TRAN BLOCK. MOV (R5)+,TE FILE. BHIS TRANE  ;ERROR IF PAST THE END. CMP BLK,MIN  ;CHECK LOW LIMIT. BLO TRANE  ;ERROR IF LOWER. JSR R5,TRNW  ;WRITE THE BUFFER. BLK: 0   ;SET TO BLOCK # TO WRITE. CMA: 0   ;SET TO MEMORY ADDRESS. 100   ;WORD COUNT. CMP R0,#BUFFB+200 ;CHECK FOR RESET TO BUFFER #1. BEQ TRAN2  ;RETURN IF NOT NEEDED. MOV #BUFFB,R0  ;RESET IF IF NEEDED. TRAN2: RTS PC   ;RETURN. TRANE: JMP TRANS3  ;PRINT ERROR MESSAGE. TRAN3: CMP R0,#BUFFB+400 ;END OF 2ND BUFF;LOOP. SPA: .BYTE 40  ;SPACE FOR FILL INS. ZERO: .BYTE 0   ;NULL FOR LAST BLOCK FILL IN. INITH: CMP R0,#BUFFB  ;MAKE SURE THAT THE LAST BEQ INITJ  ;BUFFER HAS BEEN WRITTEN. CMP R0,#BUFFB+200 ;FILL IN WITH NULLS THE LAST ONE. BEQ INITJ BHI .+10  ;BR OVER IF PRESENTLY IN 2ND BUFF. MOV #BUFFB,R2  ;GET BUFFB ADDRESS IN R2. BR .+6   ;BRANCH OVER. MOV #BUFFB+200,R2 ;GET 2ND BUFFER ADDRESS IN R2. MOV R0,R1  ;GET LAST BYTE ADDRESS IN R1. SUB R2,R1  ;GET OFFSh0O p:hvL%h/d@hBAyhyh}@nys@nOy:@nwq@n)w}@nv@@n[qj@nIq(@nIq@nafZ@nafZ@nafZ@nvLI@nVvLI@nvLI@n,@n&h$@n&@$@n&$@ni_M@n*@n*@nX*@nJ^i_M(li_Mh}@ny@nAy@nafZ@nX*@n; 9@nFvLG(`X*hH*hP*hX&$h"&@$h0&h$h>vLIhvLIh vLIhafZhNafZhVafZRBLKR+2 ;MEMORY ADDRESS. MOV (R5)+,TRBLKR+4 ;WORD COUNT. .TRAN TRNLNK,TRBLKR ;READ THE DATA. .WAIT TRNLNK  ;WAIT TILL READ IS COMPLETED. RTS R5   ;RETURN TO CALLER. TRBLKR: 0   ;LOADED WITH BLOCK NUMBER. 0   ;LOADED WITH MEMORY ADDRESS. 0   ;LOADED WITH WORD COUNT. 5   ;READ FUNCTION. 0   ;WORDS NOT TRANSFERED. TRNW: .WAIT TRNLNK  ;WAIT TILL PREVIOUS OPERATION IS DONE. MOV (R5)+,TRBLKW ;LOAD PARAMETERS IN TRAN BLOCK. MOV (R5)+,TRBLKW+2 ;MEMORY ER? BLO TRAN2  ;RETURN IF NOT. BR TRAN1  ;WRITE IT IF YES. TRNFIL: .FIL FORMAT.CON  ;FILE NAME BLOCK. TRNW: .WAIT TRNLNK  ;WAIT FOR PREVIOUS MOV (R5)+,TRNBLK ;WRITE TO BE DONE, THEN SET UP MOV (R5)+,TRNBLK+2 ;NEW PARAMETERS. MOV (R5)+,TRNBLK+4 ; .TRAN TRNLNK,TRNBLK ;WRITE IT. RTS R5   ;RETURN. TRNLNK: .LNK DF,TRN  ;TRAN LINKBLOCK. TRNBLK: 0   ;BLOCK NUMBER. 0   ;MEMORY ADDRESS. 0   ;NUMBER OF WORDS. 3   ;FUNCTION/STATUS. 0   ;WORD ETT OF LAST BYTE IN R1. ADD #200,R2  ;GET END OF BUF. ADDRESS. INITI: CLRB (R0)+  ;FILL IN WITH NULLS. CMP R0,R2  ;END OF BUF? BLO INITI  ;LOOP TILL YES. JSR PC,TRAN1  ;WRITE THE BUFFER. INITJ: MOV R0,-(SP)  ;WRITE THE 1ST WORD OF THE ADD #200,(SP)  ;1ST BLOCK WITH THE VALUE MOV TRNBLK,(R0)+ ;OF THE LAST BLOCK WHICH CONTAINS MOV R1,(R0)+  ;2ND WORD IS LAST BYTE OFFSET. MOV LINE,(R0)+  ;3RD WORD IS TOTAL NUMBER OF LINES. CLR (R0)+  ;DATA. CMP R0,(SP) h^%@%@%@Pv:(IqhIqhIq(h }hp}hv@@[qj@vLI@vLI@vLI@ v,(8,hp@n;M@n&@n@n*}K@nv@@n[qj@nafZ@n]: N@n_wq()w}hwqhOy:h}@ny@nAy@nIq@nafZ@nafZ@nvLI@nvL%@n,@n*@nX*@nADDRESS. MOV (R5)+,TRBLKW+4 ;WORD COUNT. .TRAN TRNLNK,TRBLKW ;WRITE THE DATA. RTS R5   ;RETURN TO CALLER. TRBLKW: 0   ;LOADED WITH BLOCK NUMBER. 0   ;LOADED WITH MEMORY ADDRESS. 0   ;WORD COUNT. 3   ;WRITE FUNCTION. 0   ;WORD NOT TRANSFERRED. .END NOT TRANSFERED. NXLINE: TST FLAG  ;TST EOD FLAG. BEQ .+10  ;BRANCH OVER IF NO EOD. CLR (SP)+  ;CLEAR STACK OF RET. FOR JSR NXLINE. JMP INITH  ;FINISH TRANSFER AND EXIT. JSR R5,SAVE  ;SAVE THE REGISTERS. MOV POINT1,R0  ;LINE BUFFER START ADDRESS. MOV #NXLBF,R1  ;GET (A) IN BUF. TST (R1)  ;SKIP IF NO (A) YET. BEQ .+10  ; MOVB (R1)+,(R0)+ ;MOVE THE DATA. BNE .-2   ;LOOP TILL NULL BYTE IS FOUND. DEC R0   ;ELIMINATE IT. MOV INPNT,R1  ;GET INP ;FILL IN THE REST WITH NULLS. BLO .-4   ;LOOP TILL FULL. CLR (SP)+  ;CLEAR THE STACK. SUB #200,R0  ;GET START OF BUFFER ADDRESS. MOV R0,CMA1  ;LOAD IT FOR JSR R5. JSR R5,TRNW  ;CALL TRAN ROUTINE. MIN: 0   ;SET TO 1ST BLOCK OF FILE. CMA1: 0   ;SET TO MEMORY ADDRESS. 100   ;WORD COUNT. CLR (SP)+  ;CLEAR THE STACK. .RLSE TRNLNK  ; MOV (SP)+,BUFF3+2 ;RESTORE ORIGINAL MODE. .EXIT   ;RETURN TO MONITOR. MAX: 0   ;SET TO LAST BLOCK OF FILE. TR>x((%h%h%hF:W(h&h;Mhphh@>.]: N(,]: NhJ6v@([qjh v@h.*}K(*}Kh.ysy:}@W@@( , ;IMULT. ;MULTIPLY ROUTINE WHICH MULTIPLIES ;R0 BY R1 AND LEAVES THE ;DOUBLE WORD RESULT IF R0 AND R1. ;R0 HAS THE LOW ORDER PART. ;OTHER REGISTERS ARE RETURNED UNCHANGED. ;IF AN ERROR OCCURED (OVERFLOW) THE ;C BIT WILL BE SET ON RETURN TO CALLER. .REG .TITLE IMULT .GLOBL IMULT IMULT:UT POINTER. MOV INCNT,R2  ;GET BYTES LEFT. BGT NXLN2  ;GO TO NXLN2 IF ANY LEFT. NXLN1: JSR PC,READ  ;GET A LINE. NXLN2: MOVB (R1)+,(R0)  ;GET A CHARACTER. BEQ NXLN3  ;IGNOR NULLS. CMPB (R0)+,#'(  ;LOOK FOR "(". BEQ NXLN4  ;GO TO NXLN4 IF FOUND. NXLN3: JSR PC,TST1  ;CHECK FOR END OF BUFFER. BR NXLN2  ;CONTINUE. NXLN4: JSR PC,TST1  ;CHK BUFFER. MOV #NXLBF,R3  ;GET TEMP BUFFER ADDRESS. MOVB -(R0),(R3)+ ;MOVE IN THE (. MOVB (R1)+,(R3)  ;GET THE NEXT AN: MOVB (R5)+,(R0)+ ;PUT CHARACTER IN THE BUFFER. CMP R0,#BUFFB+200 ;END OF BUFFER? BEQ TRAN1  ;TRAN1 IF END OF 1ST BUFFER. BHI TRAN3  ;TRAN3 CHECKS 2ND BUFFER. RTS PC   ;RETURN. TRAN1: MOV R0,CMA  ;LOAD MEMORY ADD. SUB #200,CMA  ;FOR JSR R5,TRNW. INC BLK   ;INC THE BLOCK #. CMP BLK,MAX  ;DON'T GO PAST THE END OF THE FILE. BHIS TRANE  ;ERROR IF PAST THE END. CMP BLK,MIN  ;CHECK LOW LIMIT. BLO TRANE  ;ERROR IF LOWER. JSR R5,TRNW  ;WRITE THE BUF!ߙEE3$ # v 6,6&@77V  @V  4,Z    c*~& w w 0w"& W@ 0$y:}d.y:}O p:@nX*@nE;M@n$" MOV R2,-(SP)  ;SAVE R2,R3, AND R4. MOV R3,-(SP)  ; MOV R4,-(SP)  ; MOV R0,R2  ;RELOCATE R0 AND R1 MOV R1,R3  ;TO GENERATE ANSWER IN THEM. CLR R0   ;CLEAR R0 AND R1. CLR R1   ; CLR R4   ;CLEAR R4 FOR DOUBLE WORD SHIFT. IMULT1: ROR R2   ;ROTATE MULTIPLICAND AND CHECK BCS IMULT4  ;FOR ADD OR NO ADD. BEQ IMULT3  ;RETURN IF ZERO AND C BIT CLEAR. IMULT2: ROL R3   ;ROTATE LEFT MULTIPLIER. ROL R4   ;CARRY INTO R4. BCC IMULT1  ;CONTINUE IF N# CHAR. CMPB (R3)+,#'A  ;IS IT AN A. BNE NXLN5  ;GO TO NXLN5 IF NOT. JSR PC,TST1  ;CHECK BUFFER. MOVB (R1)+,(R3)  ;GET NEXT CHARACTER. CMPB (R3)+,#') ;IS IT AN )? BEQ NXLN6  ;GO TO NXLN6 IF YES. NXLN5: MOV #NXLBF,R4  ;NOT AN A, PUT DATA IN OUTPUT BUFFER. MOVB (R4)+,(R0)+ ; CMP R4,R3  ;LOOP TILL R4 EQUALS R3. BLO .-4   ; CLR NXLBF  ;CLEAR FOR FLAG. BR NXLN3  ;GET SOME MORE DATA. NXLN6: CLRB (R3)  ;NULL TERMINATOR. DEC R2   ;DEC INPUT BYTE $FER. BLK: 0   ;SET TO BLOCK # TO WRITE. CMA: 0   ;SET TO MEMORY ADDRESS. 100   ;WORD COUNT. CMP R0,#BUFFB+200 ;CHECK FOR RESET TO BUFFER #1. BEQ TRAN2  ;RETURN IF NOT NEEDED. MOV #BUFFB,R0  ;RESET IF IF NEEDED. TRAN2: RTS PC   ;RETURN. TRANE: JMP TRANS3  ;PRINT ERROR MESSAGE. TRAN3: CMP R0,#BUFFB+400 ;END OF 2ND BUFFER? BLO TRAN2  ;RETURN IF NOT. BR TRAN1  ;WRITE IT IF YES. TRNFIL: .FIL FORMAT.CON  ;FILE NAME BLOCK. TRNW: .WAIT TRNLNK  ;WAIT F%.X* X*E;ME;MX*w,W@ ׭M ER X* y$@wW w PRINT11 O p:ys,.O p:X*@n*@n*@n07 e4 F"vLI*&@$X(w 6&@$ vLIIq*afZOy:&O OVERFLOW. IMULT3: MOV (SP)+,R4  ;RESTORE REGISTERS AND RETURN. MOV (SP)+,R3  ; MOV (SP)+,R2  ; RTS PC   ; IMULT4: ADD R3,R0  ;ADD TO RESULT WHEN C WAS SET. ADC R1   ;CARRY INTO R1. ADD R4,R1  ;ADD IN HIGH ORDER. BR IMULT2  ;CONTINUE. .END 'COUNT. MOV R1,INPNT  ;UPDATE POINTERS. MOV R2,INCNT  ; MOV R0,LEND  ;END OF DATA POINTER. JSR R5,RESTOR  ;RESTORE THE REGISTERS. RTS PC   ;RETURN. TST1: DEC R2   ;DEC INPUT BYTE COUNT. BLE READ  ;GO TO READ IF 0. RTS PC   ;RETURN IN ANY LEFT. READ: TST FLAG  ;CHECK FOR PREVIOUS EOD. BNE RED4  ;GO TO RED4 IF THERE HAS BEEN ONE. JSR R5,READ3  ;READ IN A BUFFER. BUFF3   ;INTO BUFFER #3. BNE RED3  ;GO TO RED3 IF EOT. RED1: MOV POINT3,R1  ;(OR PREVIOUS MOV (R5)+,TRNBLK ;WRITE TO BE DONE, THEN SET UP MOV (R5)+,TRNBLK+2 ;NEW PARAMETERS. MOV (R5)+,TRNBLK+4 ; .TRAN TRNLNK,TRNBLK ;WRITE IT. RTS R5   ;RETURN. TRNLNK: .LNK DF   ;TRAN LINKBLOCK. TRNBLK: 0   ;BLOCK NUMBER. 0   ;MEMORY ADDRESS. 0   ;NUMBER OF WORDS. 3   ;FUNCTION/STATUS. 0   ;WORD NOT TRANSFERED. NXLINE: TST FLAG  ;TST EOD FLAG. BEQ .+10  ;BRANCH OVER IF NO EOD. CLR (SP)+  ;CLEAR STACK OF RET. FOR JSR NXLINE. )5.>7 D7 eP2afZ)w},vLI(&$(*d  w .&$ vLIafZ"}$X*0  6  & i_Mwq$vLI*vLIA0 B  &vLI"vLI*vLI<& f w w .afZafZ}* ;SAVE. ;ROUTINES TO SAVE AND RESTORE THE REGISTERS. ;ENTER SAVE AND RESTOR BY JSR R5. .REG .TITLE SAVE .GLOBL SAVE,RESTOR SAVE: MOV R4,-(SP)  ;SAVE R4 THRU R0. MOV R3,-(SP)  ;R5 WAS PUT ON THE STACK BY CALL. MOV R2,-(SP)  ; MOV R1,-(SP)  ; MOV R0,-(SP)  ; MOV R5,PC  ;R5 HAS RETURN ADDRESS. RESTOR: CL+SET R1 TO 1ST BYTE OF DATA. MOV POINT3-2,R2  ;R2 IS BYTE COUNT. BEQ RED3  ;GO TO RED3 IF BYTE CNT IS 0. CLR (PC)+  ;CLEAR EOD FLAG. FLAG: 0   ;EOD FLAG. RTS PC   ;RETURN. RED2: MOV PC,FLAG  ;SET EOD FLAG. MOV R0,LEND  ;SET END OF DATA WORD. CLR (SP)+  ;CLEAR STACT OF RET FOR JSR READ. JSR R5,RESTOR  ;RESTORE THE REGISTER. RTS PC   ;RETURN TO CALLER OF NXLINE. RED3: .CLOSE LINK3  ;CLOSE INPUT FILE. .RLSE LINK3  ;RESEASE INPUT DEVICE. TST (PC)+ ,JMP INITH  ;FINISH TRANSFER AND EXIT. JSR R5,SAVE  ;SAVE THE REGISTERS. MOV POINT1,R0  ;LINE BUFFER START ADDRESS. MOV #NXLBF,R1  ;GET (A) IN BUF. TST (R1)  ;SKIP IF NO (A) YET. BEQ .+10  ; MOVB (R1)+,(R0)+ ;MOVE THE DATA. BNE .-2   ;LOOP TILL NULL BYTE IS FOUND. DEC R0   ;ELIMINATE IT. MOV INPNT,R1  ;GET INPUT POINTER. MOV INCNT,R2  ;GET BYTES LEFT. BGT NXLN2  ;GO TO NXLN2 IF ANY LEFT. NXLN1: JSR PC,READ  ;GET A LINE. NXLN2: MOVB (R1)+,(R0)-X* v@. %6E w afZ([qj.%Е pww w .afZvLI"}$X*([qj,@w  P `  v@ ,dm(`Е  Е HafZ, "”`Д ”',ӋӋ`Д ww w PAGE &.R (SP)+  ;CLEAR THE STACK, R5 FROM CALL MOV (SP)+,R0  ;NOT NEEDED. MOV (SP)+,R1  ;RESTORE THE REGISTERS. MOV (SP)+,R2  ; MOV (SP)+,R3  ; MOV (SP)+,R4  ; RTS R5   ;R5 RESTORED BY RETURN. .END / ;SEE IF FILE3 DEVICE IS FILE STRUCTURED. STAT3: 0   ;INDICATOR WORD. BPL RED5  ;MINUS IS FILE STRUCTURED. BR RED2   ;GO TO RED2 IF FILE STRUCTURED. RED4: CLR (SP)+  ;CLEAR STACK OF RET. FOR JSR READ. JSR R5,RESTOR  ;RESTORE THE REGISTERS. CLR (SP)+  ;CLR STACK OF RET. FOR JSR NXLINE. JMP INITH  ;COMPLETE OUTPUT FILE AND EXIT. RED5: .INIT KBLNK  ;PRINT END? .WRITE KBLNK,ENBF ; .WAIT KBLNK  ;WAIT FOR OUTPUT. .READ KBLNK,BUF  ;WAIT FOR OPERATOR ACTION.0  ;GET A CHARACTER. BEQ NXLN3  ;IGNOR NULLS. CMPB (R0)+,#'(  ;LOOK FOR "(". BEQ NXLN4  ;GO TO NXLN4 IF FOUND. NXLN3: JSR PC,TST1  ;CHECK FOR END OF BUFFER. BR NXLN2  ;CONTINUE. NXLN4: JSR PC,TST1  ;CHK BUFFER. MOV #NXLBF,R3  ;GET TEMP BUFFER ADDRESS. MOVB -(R0),(R3)+ ;MOVE IN THE (. MOVB (R1)+,(R3)  ;GET THE NEXT CHAR. CMPB (R3)+,#'A  ;IS IT AN A. BNE NXLN5  ;GO TO NXLN5 IF NOT. JSR PC,TST1  ;CHECK BUFFER. MOVB (R1)+,(R3)  ;GET NEXT CHARACTE1afZ}X*[qj, ,A,BC D E F G H I J K L M AB "&"<CDE.  "VFGH&.  $pIJ K#(L-\.  #(-52  ;REVISION A ;DATE 4/29/73 .REG .TITLE FORM4 .GLOBL FORM4,SAVE,RESTOR,GET,LINK3 .GLOBL FILE3,LINK2,FILE2,LINK1,FILE1 .GLOBL READ3,BU3 .WAIT KBLNK  ; .INIT LINK3  ;INIT INPUT DEVICE. .OPENI LINK3,FILE3 ;OPEN INPUT FILE. JSR R5,READ3  ;ATTEMPT TO READ ANOTHER BUFFER. BUFF3   ;BUFFER #3. BNE RED2  ;TERMINATE IF ANOTHER EOD. TST POINT3-2  ;LOOK FOR 0 BYTE COUNT. BEQ RED2  ;TERMINATE IF 0. BR RED1   ;CONTINUE IF NOT. ENBF: 10   ;MAX BYTES. 0   ;FORMATTED ASCII. 10   ;ACTUALL BYTES. .BYTE 15,12  ;CR AND LF. .ASCII /END?/  ;TEXT. .BYTE 15,12  ;CR AND LF. .EVEN B4R. CMPB (R3)+,#') ;IS IT AN )? BEQ NXLN6  ;GO TO NXLN6 IF YES. NXLN5: MOV #NXLBF,R4  ;NOT AN A, PUT DATA IN OUTPUT BUFFER. MOVB (R4)+,(R0)+ ; CMP R4,R3  ;LOOP TILL R4 EQUALS R3. BLO .-4   ; CLR NXLBF  ;CLEAR FOR FLAG. BR NXLN3  ;GET SOME MORE DATA. NXLN6: CLRB (R3)  ;NULL TERMINATOR. DEC R2   ;DEC INPUT BYTE COUNT. MOV R1,INPNT  ;UPDATE POINTERS. MOV R2,INCNT  ; MOV R0,LEND  ;END OF DATA POINTER. JSR R5,RESTOR  ;RESTORE THE REGISTERS. 5,5:M@HRNO.CUSTOMERCUSTO5: @ HRV,MERPO NO.POAMODELPART &SER,IALORDERDATECUSTOMERREQUESTDAT,EORIG.PROM.DATEREVISEDSHIPDATE',ACTUALSHIPDATEBILLINGUNITPRICE @BILLING EXTENSIONPRICES.i_M; 9@nX*@nafZ@n,7 &  ̤Ò`L%6FF3,BUFF1,POINT1,READ2 .GLOBL BUFF2,WRITE1 COL4: 0   ;COL. IN WORK. FORM4: JSR R5,SAVE  ;SAVE REGISGERS. CLR GET-6  ;INIT GET. .OPENI LINK3,FILE3 ;OPEN FILE3. .OPENI LINK2,FILE2 ;OPEN FILE2. .OPENO LINK1,FILE1 ;OPEN FILE1. JSR R5,READ3  ;1ST READ,FILE3. BUFF3   ;BUFFER #3. JSR PC,F4RD  ;1ST READ,FILE2. MOV BUFF1,R1  ;GET MAX BYTES. MOV POINT1,R0  ;OUT BUF. ADDRESS. BR .+6   ;BRANCH OVER. FORM4A: JSR PC,F4TST1  ;CHK INPUT BUF. MOVB (R2)+7UF: 1   ;MAX BYTES. 2   ;UNFORMATTED ASCII. 1   ;ACTUAL. 0   ;BUFFER. GET: MOV POINT1,R5  ;BEGINNING OF LINE. GET1: CMPB (R5)+,#'(  ;LOOK FOR (. BEQ GET4  ;GO TO GET4 IF IT IS ONE. GET2: CMP R5,LEND  ;CHECK FOR END OF LINE. BLO GET1  ;CONTINUE LOOKING IF NOT END. GET3: MOV #XX,R5  ;SEND FOUR X'S IF COLUMN NOT FOUND. MOV #4,R4  ;BYTE COUNT. RTS PC   ;RETURN. GET4: CMP R5,LEND  ;CHECK FOR END OF LINE. BHIS GET3  ;NO FIND IF PAST END. C8 RTS PC   ;RETURN. TST1: DEC R2   ;DEC INPUT BYTE COUNT. BLE READ  ;GO TO READ IF 0. RTS PC   ;RETURN IN ANY LEFT. READ: TST FLAG  ;CHECK FOR PREVIOUS EOD. BNE RED4  ;GO TO RED4 IF THERE HAS BEEN ONE. JSR R5,READ3  ;READ IN A BUFFER. BUFF3   ;INTO BUFFER #3. BNE RED3  ;GO TO RED3 IF EOT. RED1: MOV POINT3,R1  ;SET R1 TO 1ST BYTE OF DATA. MOV POINT3-2,R2  ;R2 IS BYTE COUNT. BEQ RED3  ;GO TO RED3 IF BYTE CNT IS 0. CLR (PC)+  ;CLEAR EOD FLAG. FL9& afZyAy$; 9<,$ eEB P  Е ,HЕ 7w e%g& afZafZ}X*.vLG%@%@%@q,M},$d}dYf H  %%%":,R5  ;GET A CHAR. CMPB R5,#'/  ;IS IT A /? BNE .+10  ;NO, .+10. JSR PC,FORM4M  ;YES, PUT IN BUF. BR FORM4A+4  ;NEXT CHAR. CMPB R5,#'(  ;IS IT A (? BNE FORM4A  ;NO, NEXT CHAR. JSR PC,FORM4M  ;YES,PUT IN BUF. MOVB (R2)+,R5  ;GET LINE #. JSR PC,FORM4M  ;IN R5. SWAB R5   ; CLRB R5   ; BISB (R2)+,R5  ; JSR PC,FORM4M  ;CHK BUFFERS. MOVB (R2)+,(R0)+ ;GET THE (. JSR PC,F4TST2  ;CHK OUT BUF. MOV R2,-(SP)  ;SAVE R2 AND R3. MOV R3;MPB (R5)+,R4  ;IS THIS THE CHARACTER OF INTEREST? BNE GET2  ;CONTINUE IF NOT. INC R5   ;INC ADDRESS IF YES. CMP R5,LEND  ;CHECK FOR LINE END. BHIS GET3  ;XX'S IF END. MOV R5,R4  ;SAVE BEGINNING ADDRESS. GET5: CMPB (R4)+,#'(  ;FIND END OF COLUMN. BEQ GET6  ;GO TO GET6 WHEN FOUND. CMP R4,LEND  ;END OF LINE IS ALSO END OF COLUMN. BLO GET5  ;LOOP TILL END OF COLUMN. GET6: DEC R4   ;BUMP R4 TO LAST CHAR. BEFORE THE "(". SUB R5,R4  ;GET BYTE COUNT IN R4. <AG: 0   ;EOD FLAG. RTS PC   ;RETURN. RED2: MOV PC,FLAG  ;SET EOD FLAG. MOV R0,LEND  ;SET END OF DATA WORD. CLR (SP)+  ;CLEAR STACT OF RET FOR JSR READ. JSR R5,RESTOR  ;RESTORE THE REGISTER. RTS PC   ;RETURN TO CALLER OF NXLINE. RED3: .CLOSE LINK3  ;CLOSE INPUT FILE. .RLSE LINK3  ;RESEASE INPUT DEVICE. TST (PC)+  ;SEE IF FILE3 DEVICE IS FILE STRUCTURED. STAT3: 0   ;INDICATOR WORD. BPL RED5  ;MINUS IS FILE STRUCTURED. BR RED2   ;GO TO RED2 IF =.:vLI@vLI@vLI@].fff:.vLIvLIvLIvLI(vLIq,&fe5@e w  vLI"v@,JE W DDcԋD%w W [qj*nff& vLIvLIvLI vLI.,]: N@nafZ@n[qj@n>,-(SP)  ; MOV FORM4-2,R4  ;GET COLUMN /#. MOV #ZTAB,R2  ;GET Z TABLE ADDRESS IN R2. CMPB R4,#'Z  ;IS COLUMN REQUESTED Z? BNE FRM4A2  ;NORMAL FORMAT IF NOT. MOV R5,R3  ;SAVE LINE #. FRM4A1: MOV R3,R5  ;RESTORE LINE # TO R5 AFTER GET. CLR R4   ;IF Z, USE DATE FROM 1ST BISB (R2)+,R4  ;COLUMN, IN ORDER OF ZTAB, WHICH CMP R2,#ZTAB+5  ;IS NOT AN ASTERISK. BHIS FRM4A2  ;LAST COLUMN OF ZTAB IS DEFAULT. JSR PC,GET  ;GET NEXT COLUMN OF ZTAB. CMPB 2(R5),#'*? RTS PC   ;RETURN. INCNT: 0   ;INPUT BYTE COUNT AT EXIT. INPNT: 0   ;INPUT POINTER AT EXIT. LEND: 0   ;END OF LINE POINTER. XX: "XX,"XX   ;FOUR X'S FOR NO COLUMN FIND. NXLBF: 0,0,0,0,0,0,0  ;TEMP BUFFER FOR END OF LINE FIND. .END @FILE STRUCTURED. RED4: CLR (SP)+  ;CLEAR STACK OF RET. FOR JSR READ. JSR R5,RESTOR  ;RESTORE THE REGISTERS. CLR (SP)+  ;CLR STACK OF RET. FOR JSR NXLINE. JMP INITH  ;COMPLETE OUTPUT FILE AND EXIT. RED5: .INIT KBLNK  ;PRINT END? .WRITE KBLNK,ENBF ; .WAIT KBLNK  ;WAIT FOR OUTPUT. .READ KBLNK,BUF  ;WAIT FOR OPERATOR ACTION. .WAIT KBLNK  ; .INIT LINK3  ;INIT INPUT DEVICE. .OPENI LINK3,FILE3 ;OPEN INPUT FILE. JSR R5,READ3  ;ATTEMPT TO READ ANOTHER BUFFER.A, :&  ;M&";M9,$e΋V  afZ&afZ,Hfnff0YP fnff,lE NO FILE! w  E@v@&*}K , .E@  mV 7 ]: N,7 J7J BmD @`B  ;IS 1ST CHARACTER A *? BEQ FRM4A1  ;TRY NEXT COLUMN OF ZTAB IF YES. BR FORM4B  ;USE THIS COLUMN IF NOT AN *. ZTAB: .ASCII /KJIHG/  ;ORDER OF COLUMNS FOR "Z" FORMAT. .EVEN FRM4A2: JSR PC,GET  ;GET THE COLUMN. FORM4B: MOV (R5)+,R4  ;BYTE CNT. MOV #YEAR+2,R3  ;MONTH IS FIRST. CLR -(R3) CLR -(R3) CLR -(R3) FORM4D: JSR PC,FORM4K  ;IS IT A #. BLO FORM4E  ;YES, FORM4E. CMPB (R5)+,#'-  ;NO, IS IT A -? BNE FORM4F  ;NO, FORM4F. TST (R3)+  ;YES, NED BUFF3   ;BUFFER #3. BNE RED2  ;TERMINATE IF ANOTHER EOD. TST POINT3-2  ;LOOK FOR 0 BYTE COUNT. BEQ RED2  ;TERMINATE IF 0. BR RED1   ;CONTINUE IF NOT. ENBF: 10   ;MAX BYTES. 0   ;FORMATTED ASCII. 10   ;ACTUALL BYTES. .BYTE 15,12  ;CR AND LF. .ASCII /END?/  ;TEXT. .BYTE 15,12  ;CR AND LF. .EVEN BUF: 1   ;MAX BYTES. 2   ;UNFORMATTED ASCII. 1   ;ACTUAL. 0   ;BUFFER. GET: MOV POINT1,R5  ;BEGINNING OF LINE. GET1: CMPB EafZ*}K, @ w ' [qj YYYYw p8G.wqX*@n*@n,@nB,W/ ѥ(   vL%l,$ E   E  vL%p,Hw f B`FXT PART. CMP R3,#YEAR  ;STOP AT YEAR. BLOS FORM4D  ; BR FORM4F+4  ;OUTPUT THIS DATE. FORM4E: TSTB (R3)+  ;1ST DIGIT IN YET? BEQ FORM4H  ;NO, FORM4H. TSTB (R3)  ;2ND DIGIT IN YET? BNE FORM4I  ;YES, IGNOR MORE. MOVB (R5)+,(R3)  ;NO, PUT IT IN. DEC R3   ;RESET R3. FORM4F: DEC R4   ;DEC COL. BYTE CNT. BNE FORM4D  ;FORM4D IF NOT 0. MOV #DAY,R3  ;LOOK FOR INPUT FORMAT CLR R2   ;"MONTH-YEAR" INSTEAD OF BISB (R3)+,R2  ;"MONTH-DAY-YEAR". SUBG O p:(O p:hyh}@}@;M@lz"@*y}@v@@[qj@IqP@Iq(@Iq@afZ@afZ@afZ@vLJ@vLI@vLI@vLI@H(R5)+,#'(  ;LOOK FOR (. BEQ GET4  ;GO TO GET4 IF IT IS ONE. GET2: CMP R5,LEND  ;CHECK FOR END OF LINE. BLO GET1  ;CONTINUE LOOKING IF NOT END. GET3: MOV #XX,R5  ;SEND FOUR X'S IF COLUMN NOT FOUND. MOV #4,R4  ;BYTE COUNT. RTS PC   ;RETURN. GET4: CMP R5,LEND  ;CHECK FOR END OF LINE. BHIS GET3  ;NO FIND IF PAST END. CMPB (R5)+,R4  ;IS THIS THE CHARACTER OF INTEREST? BNE GET2  ;CONTINUE IF NOT. INC R5   ;INC ADDRESS IF YES. CMP R5,LEND  ;CHECK FOR IyafZAy,l D )ͥ  $ՋW   ,,ՋW` Ջͥ  Ջͥ,  Ջ P  Е I,  Е ww &vLI afZ$}&X*& w  ;& Iq *afZafZb.x((%h%hJ #60,R2  ;CONVERT SO FAR ASSUMED "DAY" MOVB (R3),R3  ;TO BINARY. BIC #177600,R3  ;CLEAR ABOVE ASCII. BEQ FRM4F1  ;FIXIE SUB #60,R3  ;CONVERT ASCII TO BINARY. BMI FRM4F1  ;IF SECOND DIGIT IS ZERO ASSUME "DAY". ASL R2   ;IF NOT, ACCUMULATE BINARY NUMBER. ADD R2,R3  ;MULTIPLY 1ST DIGIT BY 10.. ASL R2   ; ASL R2   ; ADD R3,R2  ;GET TOTAL IN R2. CMP R2,#31.  ;COMPARE WITH MAXIMUM NUMBER BLOS FRM4F1  ;OF DAYS IN A MONTH. MOV DAY,YEAR  ;IF GREK^'V@'hV@'@V@'V@&$@&h$@&@$@&$@*@*@X*@:(IqhIqhIq(h IqPh0}h}l}hv@@[j@vLJvLI@vLI@vLI@v,(8,hp@n;M@n&@n@n*}K@nv@@n[qj@nafZn]: N@n_~*y}(*y}hD@Oy:hjz}h:}@n}}@n(yLLINE END. BHIS GET3  ;XX'S IF END. MOV R5,R4  ;SAVE BEGINNING ADDRESS. GET5: CMPB (R4)+,#'(  ;FIND END OF COLUMN. BEQ GET6  ;GO TO GET6 WHEN FOUND. CMP R4,LEND  ;END OF LINE IS ALSO END OF COLUMN. BLO GET5  ;LOOP TILL END OF COLUMN. GET6: DEC R4   ;BUMP R4 TO LAST CHAR. BEFORE THE "(". SUB R5,R4  ;GET BYTE COUNT IN R4. RTS PC   ;RETURN. INCNT: 0   ;INPUT BYTE COUNT AT EXIT. INPNT: 0   ;INPUT POINTER AT EXIT. LEND: 0   ;END OF LINE POINTER. XX:M    .:W(h&h;Mh0'|Q&www6/ *6,(wwY $Lw^p ^o.]: N(,]: NhJ,&C    NATER, ASSUME IT TO BE "YEAR". CLR DAY   ;DAY IS 00. FRM4F1: MOV #YEAR,R3  ;DONE, OUTPUT DATE. JSR PC,FORM4J  ;YEAR 1ST. MOV #MONTH,R3  ;THEN MONTH. JSR PC,FORM4J  ; TST SR   ;LOOK FOR BIT 15 OF SW. REG. TO BE SET. BPL .+4   ;IF SET, NULLIFY "DAY". CLR (R3)  ;OMIT DAY OF MONTH JSR PC,FORM4J  ;THEN DAY. MOV #10.,R3  ;FILL IN WITH NULLS. FORM4G: CLRB (R0)+  ;CLEAR A BYTE. JSR PC,F4TST2  ;CHK OUT BUF. DEC R3   ;DONE? BNE FORM4G  ;NO, LOOPOy!@nafZ@nvLI@n&@$@n#8r@nX*@n(vLG(xX*h`*hh*hp&$h:&@$hH&h$hV&$h,vLIhvLIh vLIhvLJh afZhffZhnafZhv%@%@%@B>Ax(( %h%h%h#8r(#8rhY]h(yyah}}h8jz}@nOy:@nIq@nafZ@nvLI@nvLI@n&$@n*@n "XX,"XX   ;FOUR X'S FOR NO COLUMN FIND. NXLBF: 0,0,0,0,0,0,0  ;TEMP BUFFER FOR END OF LINE FIND. .END TRANS QC D T$`A a.v@([qjh v@h"&f&G [.*}K(*}Kh&ABC D E F G H I J K L M .R. MOV (SP)+,R3  ;YES, RESTORE R3. MOV (SP)+,R2  ;AND R2. BR FORM4A  ;NEXT LINE. FORM4H: MOVB (R5)+,-(R3) ;PUT IN 1ST DIGIT. BR FORM4F  ;NEXT CHARACTER. FORM4I: INC R5   ;SKIP THIS ONE. BR FORM4F-2  ;NEXT ONE. FORM4J: TSTB 1(R3)  ;CHECK FOR ONLY ONE DIGIT. BNE .+4   ;MAKE IT THE 2ND ONE IF THERE SWAB (R3)  ;IS ONLY ONE. JSR PC,(PC)  ;DO THE NEXT FOUR INSTRUCTIONS MOVB (R3)+,(R0)+ ;TWICE. MOVE THE TWO DIGITS BNE .+10  ;FOR YEAR, MONTH, OR DAY INTS'V('Vh}@nv@@n[qj@nIq(@nIq@nvLI@nvLI@nvLI@n,@n&h$@n&@$@n&$@n*@n*@nX*@n@'@V(D'@VhC}@nv@@n[qj@nIq(@nIq@nafZ@nfZ@nvI@nvI@nvLI@n,@n&h$@n&@$@n&$@n*@n*@nOX*@n@'hV@@@('hVh}@nv@@n[qj@nIq(@nIq@nvLI@nLI@nvLI@n,@n&h$@T .TITLE SECTOR SELECT TIMING TEST FOR DDC DISCS ; DATE: 13-JUN-74 ; THIS PROGRAM EXERCISES THE DISC CONTROLLER SECTOR SELECT ; MECHANISM BY PERFORMING REPEATED LOOPS OF SYNCHRONIZED WRITES, ; WITH THE TIME BETWEEN THE TWO WRITES BEING A CONTROLLED VALUE. ; THE PROGRAM IS WRITTEN SO THAT THE SECOND WRITE COMMAND IS ISSUED ; SOMEWHERE IN THE ONE MILLISECOND WINDOW AHEAD OF THE END OF THE ; SELECTED SECTOR, WITH THE POSITION IN THAT WINDOW WALKINVO MOVB #60,-1(R0)  ;THE OUTPUT BUFFER. MAKE BR F4TST2  ;NULLS ASCII 0. FORM4K: CMPB (R5),#'*  ;IS IT AN *? BNE FORM4L  ;NO, FORM4L. MOVB #377,(R0)+  ;YES, CONVERT TO 377. MOV #16.,R3  ;FILL IN NULLS. CLR (SP)+  ;CLEAR THE STACK. BR FORM4G+2  ;GO TO FORM4G. FORM4L: CMPB (R5),#71  ;IS IT AN ASCII #? BHI .+6   ;NO, EXIT. CMPB #57,(R5)  ;LESS THAN #0? RTS PC   ;RET. FORM4M: MOVB R5,(R0)+  ;OUTPUT THE CHAR. F4TST: JSR PC,F4TST2  ;CHK BOTH BUFFWn&@$@n&$@n*@Dn*@nX*@n @@'V('Vhlz"h}@nv@@n[qj@nIq(@nIq@nafZ@nvLI@vLI@nvLI@n,@n&hd@n&@$@n&$@n@*@DnXj@no6v@Ah@qjh v@h.]: Nh,]: NhJ.*}K@(*}KhF:WXG ; TOWARDS THE SECTOR WITH A SELECTABLE TIME INCREMENT. ; A WRITE-CHECK IS THEN MADE ON THE ENTIRE TRACK. ; UPON DETECTION OF ANY ERROR, THE DISC REGISTERS WILL BE SAVED, ; AND THE ENTIRE TRACK WILL BE READ INTO THE INPUT BUFFER. ; NOTE THAT THE PARAMETER BLOCK CONTAINS CELLS TO BE INITIALIZED BY ; THE USER, AND OTHER CELLS TO BE INSPECTED FOR INFORMATION. ; PROGRAM FLOW: ; 1. INIT OUTPUT BUFFER TO ONE OF THREE PATTERNS. ; Y R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 BEGIN: CMP -(SP),-(SP) CMP -(SP),-(SP) MOV #SERV1,130 ;INIT INTERRUPT VECTORS. MOV #340,132 MOV #SERV2,134 ; MOV #340,136 DGEN: MOV #BUF1,R0 ;SET BUFFER POINTER. MOV #BUF2,R1 ; MOV #4096.,R2 ;SET UP COUNTER. CLR R3 ;INIT DATA. MOV R3,D1 ;INIT DATA PATTERN. MOV R3,D2 DGEN1: MOV R3,(R0)+ ;LOAD UP BUFFER. MOV R3,(R1)+ ; INC R3 ;UPDATE DATA. DEC R2 ;CHECK FOR DONE. BNE DGEN1 ; CLR -(SP) JSR PC, ZS. F4TST1: DEC R3   ;END OF IN BUF? BEQ F4RD  ;READ MORE IF YES. RTS PC   ;RETURN IF NO. F4TST2: DEC R1   ;OUT BUF FULL? BEQ F4WRT  ;WRITE IF YES. RTS PC   ;RETURN IF NO. F4RD: JSR R5,READ2  ;READ FILE2. BUFF2   ;INTO BUFFER #2. BNE F4RD1  ;BRANCH IF EOF. MOV #BUFF2+4,R2  ;GET BYTE CNT IN R3. MOV (R2)+,R3  ; MOV (R2),R2  ;POINTER IS R2. RTS PC   ;RETURN. F4RD1: JSR PC,F4WRT  ;WRITE LAST BUFFER. .CLOSE LINK3  ;CLOSE FILE3. .CLO[(h&h;hphh@ >@@@A.O p:X*@*@*@ @@@, "@"MU  D0$    "ZC"Z `(*vLI@ Lw w M@.vI&$vL&@$vLIK@$dD@G.vLIN&l$&h$EvLI&@$\2. DETERMINE FULL TRACK TIME BY TIMING ; A SYNCHRONIZED WRITE. ; 3. INITIALIZE SELECTED TRACK WITH SELECTED DATA PATTERN. ; 4. INIT MINIMUM DELAY TIME TO ABOUT ONE MILLISECOND LESS ; THAN FULL TRACK TIME (USING 15/16 OF FULL TIME). ; 5. SYNCHRONIZE WITH SELECTED SECTOR ; 6. WAIT OUT THE DELAY TIME. ; 7. ISSUE WRITE TO SELECTED SECTOR AGAIN. ; THIS IS THE COMMAND ISSUED INSIDE THE ONE-MILLIS]SERV1 ;SET UP DISC. CLR -(SP) JSR PC, SERV2 ;SET UP DISC2. BR . ;HANG UP. D1: 0 HDR1: 0 ;DAE 0 ;DAR. BUF1 ;CMA -4096. ;WCR 0 ;FLAG D2: 0 HDR2: 0 ;DAE 0 BUF2 -4096. 0 SERV1: MOV R4,-(SP) MOV R5,-(SP) MOV #165310,R0 ;DAE ADDRESS. TST -10(R0) ;ANY ERRORS? BMI ERR ;YES. BIS #400,-10(R0) ;POWER CLEAR. MOV #HDR1,R1 ;GET HEADER POINTER. MOV (R1)+,(R0) ;LOAD UP. MOV (R1)+,-(R0) MOV (R1)+,-(R0) MOV (R1)+,-(R0) MOV #BUF1,R5 MOV D1,R4 MOV #4096.,-(^SE LINK2  ;CLOSE FILE2. .CLOSE LINK1  ;CLOSE FILE1. .DELET LINK2,FILE2 ;DELETE FILE2. CLR (SP)+  ;CLEAR THE STACK. JSR R5,RESTOR  ;RESTORE THE REG'S. RTS PC   ;RETURN. F4WRT: MOV #BUFF1+6,R1  ;CALCULATE BYTE CNT. SUB (R1),R0  ; MOV R0,-2(R1)  ;PUT IN HEADER. MOV (R1),R0  ;RESET POINTER. MOV -6(R1),R1  ;AND MAX BYTES. JSR R5,WRITE1  ;WRITE THE BUFFER. BUFF1   ;BUFFER #1. RTS PC   ;RETURN. MONTH: 0   ;GET MONTH HERE. DAY: 0   ;DAY_@ @@w\i@.&@$ wLIvLJ&d@vLJ*  ӕ/w )2 afZafZIq(*$afZ,ѥ(    ѥAӕ(_ӕ) e%7w &X*"$X*(af@( ӕ/ 7wO敀E@.DΏ*X*vLI@"vLI$@.$ #<R" fP .A `ECOND WINDOW. ; 8. WRITE-CHECK ENTIRE TRACK. ; 9. IF NO ERROR, INCREASE DELAY TIME BY THE SELECTED ; INCREMENT VALUE, AND GO BACK TO 5. ; (ABOUT ONE MICROSECOND), AND GO BACK TO 5. ; 10. WHEN END OF WINDOW IS REACHED, GO BACK TO 4. ; 11. IF ANY ERROR, READ ENTIRE TRACK, AND HALT. ; 12. ALL PERTINENT PARAMETERS RELATED TO ERROR ARE TO BE FOUND ; IN THE PARAMTER AND DISC REGISTER BLOCKS. R0=%0 R1=%aSP) CMP R4,(R5)+ BNE ERR INC R4 DEC (SP) BNE .-10 TST (SP)+ COM (R1)+ ;FLAG BEQ RD1 INC D1 MOV #BUF1,R5 MOV D1,R4 MOV #4096.,-(SP) MOV R4,(R5)+ INC R4 DEC (SP) BNE .-6 TST (SP)+ MOV #103,-(R0) ;WRITE. BR EXIT1 RD1: MOV #105,-(R0) EXIT1: MOV (SP)+,R5 MOV (SP)+,R4 RTI SERV2: MOV R4,-(SP) MOV R5,-(SP) MOV #165330,R2 TST -10(R2) BMI ERR BIS #400,-10(R2) MOV #HDR2,R3 MOV (R3)+,(R2) MOV (R3)+,-(R2) MOV (R3)+,-(R2) MOV (R3)+,-(R2) MOV #BUF2,Rb, AND YEAR. YEAR: 0   ;2 DIGITS MAX. .END c@<@@D<(*y}*w  ~@.&$ vLIvLIvLI$vLI,l  ֋@.A.H;M@.$vLJ".@$f&@$@$N.vLI&$&$vLJ&$lU@ɨ Z/A Q@fX$ ~LI, 4 (  A J@,A j   d1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; DDC DISC PARAMTERS: ; TOTAL SECTORS 100000 (32768) ; TOTAL TRACKS 1000 ( 512) ; WORDS/SECTOR 100 ( 64) ; SECTORS/TRACK 100 ( 64) ; WORDS/TRACK 10000 ( 4096) .PAGE ; PARAMETER BLOCK #1: TO BE SET UP BY USER DISC: 165300 ; EPA OF FIRST REGISTER SECTOR: 0 5 MOV D2,R4 MOV #4096.,-(SP) CMP R4,(R5)+ BNE ERR INC R4 DEC (SP) BNE .-10 TST (SP)+ COM (R3)+ BEQ RD2 INC D2 MOV #BUF2,R5 MOV D2,R4 MOV #4096.,-(SP) MOV R4,(R5)+ INC R4 DEC (SP) BNE .-6 TST (SP)+ MOV #103,-(R2) BR EXIT2 RD2: MOV #105,-(R2) EXIT2: MOV (SP)+,R5 MOV (SP)+,R4 RTI ERR: HALT 240 240 240 240 BR ERR BUF1: .=.+8192. BUF2: .=.+8192. .END BEGIN f ;TABLE/SORT/PRINT. ;TABLE OF VALUES FOR LENGTH OF ONE ;BLOCK OF DATA WHICH IS ONE LINE ;AND THE LENGTHS OF ONE BLOCK WHICH ;IS ONE COLUMN. .TITLE TABLE .GLOBL TABLE TABLE: 136.   ;LENGTH OF ONE LINE. .BYTE 'A,4  ;LENGTHS OF COLUMNS A THRU M. .BYTE 'B,16.  ; .BYTE 'C,13.  ; .BYTE 'D,10.  ; .BYTE 'E,13.  ; .BYTE 'F,13.  ; .BYTE 'G,9.  ; .BYTE 'H,9.  ; .BYTE 'I,9.  ; .BYTE 'J,9.  ; .BYTE 'K,9.  ; .BYTE 'g w afZ$}&*L"w .IqPX*afZafZvLI{$2w w .vLIvLJ&@$@vLI&$T N@ w .vLJ&@$ &$vLIIq,fw ,P 7 r@**afZv@@,&lz"( w wIw"%.h ; SECTOR UNDER TEST WRDCNT: 64. ; # OF WORDS DURING WRITE TEST (POSITIVE) PATERN: 0 ; FIRST WORD OF DATA BUFFER MODE: 1 ; DATA BUFFER PATTERN SEQUENCE: ; 0 = ALL WORDS THE SAME ; 1 = PATTERN INCREMENTING BY [INCR] ; 2 = ALTERNATING COMPLEMENT INCR: 1 ; INCREMENT VALUE FOR MODE 1 PATTERN DLYINC: 10 i JEQ DKMERR ;YES CMP #MPLTIM,MPL+MPLERR ;NO,TIME OUT JEQ DKMERR ;ERROR RETURN JSR PC,MTADBG 23$: JMP DKMT95 DKMERR: MOV MPL+MPLLOG,-(SP) ;SET LOG FUNCTION AS ERROR RTS PC ;RETURN ;******** *******; ; DOUBLE BUFFER DISK COPY ROUTINE ; ; ;******** *******; DKMT10: L,11.  ; .BYTE 'M,10.  ; 177777  ;TABLE TERMINATOR. .END klz"TF _qjv@&@$"f@$@"Cw .vLIf\$&$vLIIq@kw  .* } *vLIvLId@@,Cw ff̈֋e)&&$ &$@vLIqj ,fUf@@5."@ABC '@V$'V('V@HDEl ; DELAY INCREMENT VALUE ; PARAMETER BLOCK #2: DYNAMIC PARAMETERS SET UP BY PROGRAM MAXTIM: 0 ; MAX DELAY FROM "READY" TO "GO" MINTIM: 0 ; ONE MILLISECOND LESS THAN ABOVE VALUE DLYTIM: 0 ; CURRENT DELAY TIME COMAND: 0 ; CURRENT COMMAND CMA: 0 ; CURRENT WRITE/WRITE-CHECK BUFFER ACTWC: 0 ; MOST RECENTLY OUTPUT WORD COUNT (2'S COMPL) CURSEC: m ;TRY TO READ DISK TST DSKSTA ;DISK I/O IN PROCESS? BEQ DKMT45 ;NO. FIRE IT UP. CMP #1,DKIOLT ;YES. TEST THE THREAD. BNE DKMT60 ;STILL IN PROGRESS. TRY MT CLR DSKSTA ;DISK I/O NOT IN PROGRESS. TST DSKDON ;IS THIS FIRST TIME THIS PATH NOT-IN-PROGRESS? BEQ DKMT45 ;NO. FIRE IT UP. CLR DSKDON ;YES. CLEAR FIRST TIME INDICAToFGH7.'XV hVN'h'V'c@C\IJKL͈ A@n'VDJ'VEgV@VV'@V;,pN@OPQRSTUFV.@An CZFC"&WXYZ A'V.:HvLI@vI@DvLID]B@.fff*@.vLIvLIp0 ; MOST RECENTLY ADDRESSED SECTOR RELSEC: 0 ; SECTOR RELATIVE TO BEGIN OF TRACK BGNSEC: 0 ; SECTOR 0 OF SELECTED TRACK ERRBLK: ; CONTROLLER REGISTERS UPON ERROR 0 ; DCS 0 ; WC 0 ; CMA 0 ; DAR 0 ; DER .PAGE BEGIN: RESET MOV DISC,R5 ; SET UP TO ADDRESS SELECTED DISC MOV SECTOR,R0 qOR. TSTB MTTAB ;M/T HAVE BUFFER IN FIRST TABLE ENTRY? BEQ DKMT35 ;NO MOVB DKTAB,MTTAB+1 ;YES. INSERT AS 2CD ENTRY. BR DKMT38 ;FIX DISK TABLE DKMT35: ; MOVB DKTAB,MTTAB ;INSERT AS FIRST ENTRY DKMT38: ; MOVB DKTAB+1,DKTAB ;PACK UPWARD DISK TABLE. CLRB DKTAB+1 ;CLEAR SECOND ENTRY. DEC CNTTRN ;DECREMENT CsvLIvLI(vLIDq@DA,&DAffe5@@vLIvLJvLJq,Je w  E W  DDcv@.CnԋD%w w f&[qj[qj"vLI(vLI,ff& vLIvLIvLJ"vLJ.,]N@naf^@n[qj@n@t BIC #^C77,R0 MOV R0,RELSEC ; SELECTED SECTOR RELATIVE TO TRACK BEGIN MOV SECTOR,R0 BIC #77,R0 MOV R0,BGNSEC ; SECTOR ADDRESS FOR FIRST SECTOR IN TRACK MOV #OUTBUF,R0 ; INIT WRITE BUFFER MOV PATERN,R1 MOV #4096.,R2 ; WORDS PER TRACK 10$: MOV R1,(R0)+ MOV MODE,R3 BEQ 30$ ; MODE = 0: ALL DATA WORDS ALIKE ASR R3 BCC uOUNT OF TRANSFERS. ANY MORE? BGT DKMT40 ;YES CLR CNTDSK ;NO, CLEAR COUNT OF DISKS BR DKMT60 ;TRY MAG TAPE DKMT40: ; ADD #SCTTRN,SECTNO ;SECTORS/TRANSFER ADDED TO SECTOR NUMBER DKMT45: ; TST CNTDSK ;HAS DISK COMPLETED? BEQ DKMT60 ;YES CMPB #1,DKTAB ;IS A BUFFER AVAILABLE FOR DISK READ? BGT DKMT60 w,:@&  ;M&";M9,$e΋V  afZafZHZfnff0YP fnff,lE NO FILE! w JE@@v@&*}K , .E@  mV 7 ]: N@,@7`J7J BmD @`@DafZ*}K@,x 20$ ADD INCR,R1 ; MODE = 1: INCREMENTING DATA BR 30$ 20$: COM R1 ; MODE = 2: ALTERNATING COMPLEMENT 30$: SOB R2,10$ .PAGE ; NOW DETERMINE FULL TRACK TIME AND DELAY LIMITS. JSR PC,SETSEC ; SET UP FOR ADDRESSING SELECTED SECTOR JSR PC,HITDSC ; FIRST WRITE FOR SYNCHRONIZATION JSR PC,HITDSC ; WILL NOT COMPLETE UNTIL NEXT REVOLUTION MOV R4,R3 y ;NO. TRY M/T. ; ; DISK I/O ; BEQ DKMT48 ;USE FIRST BUFFER MOV DSKBAD+2,DKMT52 ;SET BUFFER 2'S ADDRESS BR DKMT50 ; DKMT48: ; MOV DSKBAD,DKMT52 ;SET BUFFER 1'S ADDRESS DKMT50: ;DISK I/O JSR R5,DISKIO ;ISSUE I/O .WORD EXIT1 ;EXIT TYPE=1 DKMT52: .WORD 0 ;ADDRESS OF DISK BUFFER ADDRESS. DKMT53: .WORD 0 { @ w '@J[qj @@YYՕ]w @p8G.*y}Xj@n#8@n&$@nF@(DaՕ/ 7 7 -@.afZ X*}}(yy!@"&@$zD@.@ @bI0w fUv.F&$ vLIbc8r f"(A%. /w fzw z| ; # OF LOOPS WAITING FOR READY ASL R3 ASL R3 ASR R4 SUB R4,R3 ; TIMES 3.5 MOV R3,MAXTIM ; SET UP MAX DELAY TIME MOV R3,R4 ASH #-4,R3 ; /16 (16 MSEC/16 = 1 MSEC) SUB R3,R4 MOV R4,MINTIM ; ESTABLISH LIMITS OF DELAY TIME JSR PC,WRTTRK ; INITIALIZE ENTIRE TRACK WITH DATA ; NOW DO THE SYNCHRONIZED WRITES. 40$: MOV } ;ENTIRE DISK FILE ID .WORD DKREAD ;READ COMMAND .WORD SECTNO ;ADDRESS OF SECTOR NUMBER .WORD WRDTRN ;WORDS/TRANSFER INC DSKSTA ;SET DISK IN-PROGRESS. INC DSKDON ;SET DISK NOT-JUST-COMPLETED. ; MAG TAPE SERVICE ; DKMT60: ;M/T I/O SERVICE CMP #1,MPHLST ;M/T I/O IN PROGRESS. BEQ DKMT65 ;NO. DKMT62: TST CNTDSK b *#8rfzAz$b(#8r.l/w zfw fAfzzAff"f(z, r |bDaB  b{@@,/~ fb / w xf }}bT#8r&f,A @D! EÕ UeB@@D@A@@H@, @UQ K ." @ @w MINTIM,DLYTIM ; INIT TO FRONT OF WINDOW 50$: MOV DLYTIM,R3 ; SET UP FOR THIS DELAY LOOP JSR PC,SETSEC ; SET UP FOR WRITING ONE SECTOR JSR PC,HITDSC ; DO FIRST WRITE FOR SYNCHRONIZATION SOB R3,. ; DELAY UNTIL WINDOW COMES UP JSR PC,HITDSC ; ISSUE THE COMMAND IN THE WINDOW JSR PC,WRTCHK ; NOW SEE IF IT PRODUCED ANY ERRORS ADD DLYINC,DLYTIM ; WAS GOOD: NOW WALK TOWRDS END  ;YES. ALL DISKS COMPLETE? JNE DKMT10 ;NO. TRY THE DISK. BR DKMT60 ;YES. STAY WITH M/T. DKMT65: ; TST MTDON ;JUST COMPLETED? BEQ DKMT75 ;NO. TST MPHLST+MPHERR ;YES. ERROR? BEQ DKMT66 ;NO CMP #11,MPHLST+MPHERR ;YES. FATAL? BNE DKM65A ;NO DKMTER: ;MT FATAL ERROR MOV MPw "afZ$ت(}"@H@AQ X*afZv  ^ @N@@ W@.vLG%@%@%@q,@P,$}d@},@H}dYfE@"%l OF WINDOW CMP DLYTIM,MAXTIM ; DID WE REACH ITS END? BLE 50$ ; NOT YET BR 40$ ; RESET TO FRONT OF WINDOW .PAGE WRTTRK: MOV #3,COMAND ; WRITE COMMAND MOV BGNSEC,CURSEC ; POINT TO TRACK BEGIN MOV #OUTBUF,CMA ; START OF DATA BUFFER MOV #-4096.,ACTWC ; FULL TRACK JSR PC,HITDSC ; EXECUTE FUNCTION RTS PC WRTCHK: MOV #7,COMAND ; L+MPLLOG,4(SP) ;YES, LOGICAL UNIT TO STACK TST (SP)+ ;RETURN TO MAIN LINE RTS PC ;RETURN DKM65A: ; CMP #12,MPHLST+MPHERR ;NO. TIME-PUT? BEQ DKMTER ;YES JSR PC,MTADBG DKMT66: ; CLR MTDON ;YES. CLEAR JUST-COMPLETED MOV #MPL,R0 ;SET PRE-HANDLER LIST ADDR JSR R5,MTLTST ;GO TO UPDATE RE%%.x(( %h%l@    #8r*@n&X$nvLI@n@,&  UuD@F&$&$LI@9,C$lы @%IjHɥ/@,Hw$P  U w,l@H @WRITE CHECK INC CURSEC ; DO CHECK ON FOLLOWING SECTOR ADD #200,CMA MOV #-64.,ACTWC JSR PC,HITDSC RTS PC SETSEC: ; SET UP PARAMETERS FOR A ONE-SECTOR WRITE MOV RELSEC,R0 ASH #7,R0 ; X 128 BYTES PER SECTOR ADD #OUTBUF,R0 MOV R0,CMA ; POSITION IN DATA BUFFER MOV WRDCNT,ACTWC NEG ACTWC ; WORD COUNT MOV CORD NUMBER TSTB DKTAB ;DISK'S FIRST BUFFER EMPTY? BEQ DKMT67 ;YES. MOVB MTTAB,DKTAB+1 ;NO. INSERT IN 2CD ENTRY. BR DKMT70 ; DKMT67: ; MOVB MTTAB,DKTAB ;INSERT IN FIRST ENTRY. DKMT70: ; MOVB MTTAB+1,MTTAB ;PACK MT TABLE UPWARD. CLRB MTTAB+1 ;CLEAR 2CD ENTRY. DKMT75: ; CMPB #1,MTTAB &̘I&$ &$dvLI],w  ѥ/ Iq*f 0  "ɥ(BwX,wTPR7 wI@@@Iq *&afZ(* % 7 v&afZjz}vLIvLI.'VX*@n*@n*@nM(w SECTOR,CURSEC MOV #3,COMAND ; WRITE RTS PC .PAGE HITDSC: ; SUBROUTINE TO SET UP CONTROLLER AND ISSUE COMMAND CLR R4 ; WILL RETURN A LOOP WAIT COUNT MOV ACTWC,2(R5) ; WC MOV CMA,4(R5) ; CMA MOV CURSEC,6(R5) ; DAR MOV COMAND,(R5) ; DCS 10$: INC R4 ; LOOP DELAY COUNT TSTB (R5) BPL 10$ ; BRIF NOT REA ;IS BUFFER READY? BGT DKMT85 ;NO. TEST DISK IO TO DO. ; ; FIRE UP M/T ; STPHDR MPL,MPL+MPLLOG,MTYDI,HNDLER ;SET LIST FOR WRITE STHAND MPHLST,EXIT1,MTBUF1,MPHWRT,WRDTRN+MPHDSZ,0 ;SET-UP HANDLER LIST. CMPB #1,MTTAB BEQ DKMT80 ;1ST MOV #MTBUF2,MPHLST+MPHDTB ;2CD. SET IT DKMT80: ; MOV #MPL,-(SP) ;PRE-HANDLER LIST ADDR JSR PC,MTIO 7   .v@ ,&h$&h$"vLIs$ @nD &@$&@$vLI&d&$,< D *@&vLI Iq(*X*,`/ ( Pg,@P f  DC @,, # C  А L ,נ  :4  , C YDY TST (R5) BMI 20$ ; BRIF ERROR RTS PC ; ON ERROR, DUMP REGISTERS, READ ENTIRE TRACK, AND HALT. 20$: MOV #ERRBLK,R0 ; DUMP DISC REGISTERS ON ERROR MOV (R5),(R0)+ MOV 2(R5),(R0)+ MOV 4(R5),(R0)+ MOV 6(R5),(R0)+ MOV 10(R5),(R0)+ MOV BGNSEC,R2 ; DUMP ENTIRE TRACK MOV #INPBUF,R3 MOV #64.,R4 30$: MOV #400,(R5) ;ISSUE WRITE INC MTDON ; SET MT IN PROGRESS. BR DKMT62 ;TEST DISK DKMT85: ;NO BUFFER READY FOR MT WRITE. TST CNTDSK ;DISK COMPLETED? BNE DKMT62 ;NO RTS PC ;RETURN ; ; ;******* END OF DOUBLE BUFFER ROUTINE *******; ; DKMT95: MOV COMPIR,R0 ;SET COMPID BASE MOVB #1,DEVN,А     3,+w  >'. Iq ** vLIvLI,8 -svLI&@$vLI,\'#w @1@Aw t[qjX*&},נ*נpנ9נ@נCX*(Z.&@$&$vL&$"&; RESET DISC MOV #-64.,2(R5) ; READ ONE SECTOR AT A TIME MOV R3,4(R5) ; CMA MOV R2,6(R5) ; DAR MOV #5,(R5) ; READ TSTB (R5) BPL .-2 ADD #200,R3 ; NEXT LOC'N IN READ BUFFER INC R2 ; NEXT SECTOR SOB R4,30$ HALT OUTBUF: .BLKW 4096. ; DATA BUFFER FOR WRITE AND WRITE-CHECK INPBUF: .BLKW 4096. ; READ BUFFER UM(R0)$@@$.vLI&@$&@$vLI&h$N,M* W(&h$ vLIX*,W/P P  Y@,( W*@  ,L Ċ  W( ,pW/P I JH:@n'@VX*@n*@n*@n%FOR ERROR DUMP .END  @w 7 .v@ ,fh$&h$vLI$U. &@$&@$vLI@&$&$@@,@4w  S ѥ( &vLILIq(*afZW,X   S E  SJ\@@lE  vS  jj Da r@A,,ee7W*W0 @ifZ,W9 Kc   +( K w w .}X*Iq*"afZ@" /w @.afZafZafZ}X*@"" @.vLI vLIvLI&@$vLI@<w [qn*.'hVX*@n*@n*@n(@w 7   .v@ ,&h$&h$"vLIs$ . &@$&@$vLI&$&$,<w @ &vLI Iq(*X*,`/ ( P ,P fI DC ,, & C  А R s,נ נ- 4. , 4,C А    ), +w R >U`@&q.@*&vLI8 &vLIvLI&@dvLI,\-'#w @1@A1V[jتw נ*@נ0נ9נ } X*.C@נZUYnD&$&$vLI$&$(&$$.vLI&@$&@$vIh$N@@,C@N *U@@B W(@&$ vLI@X*, W/P P  Sl. *  ,R    W ,v(W/ W!fD! ~p@@%,   hP  \   .'VX*@n*@n*@n w 7 .v@ ,&h$&h$vLI$. &@$&@$@vLI&$&$@@@@E 4w B.vLI q^*ΏX*afZ,L (W/ W(  ,p xZC $' ԗ W*KJIHGr ,, D# # # W-  , $#,Ӌ-ˋ-K ˋ פ3 ,ע1 #  0 (   ,    R c ,D Д0W*Е 9,hW9ͥ/P   w S$Iq&*1. $.*vLIvLI"vLI(&@$, w @1@Aw @.vLI[qjX*$}&X*mF.v@([qjh v@h"&f&G [.]: N(,]: NhJ,&C    C D T@$`A a.*}K(*}Kh&ABC D E F G H I J K L M ..:W(h&h;Mh0'|Q&www6/ j6,(wwY $Lw^p ^oY{eY'P8ermmjGAv ,rӹP`nUU(`]ԑT? Mhh,,x?LZ0Ѳz(uj=4z$ cYp_3]X#'υDwoc+i4yEO@bF{|~(TeY '\\556rDjIʚPzK xO_ʤwh'A]X2#{(<ۙ6dL O!4(bD_٥\t`⽑<{T}39#gȄ&[l *g, O[~k}k|k{kzkykxkwkvkuktkskrkqkpkoknkmklkkkjkikhkgkfkekdkckbkak`k_k^k]k\k[kZkYkXkWkVkUkTkSkRkQkPkOkNkMkLkKkJkIkHkGkFkEkDkCkBkAk@k?k>k”=kÔj?j@jAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj[j\j]j^j_j`jajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzj{j|j}j~jjj~j}j|j{jzjyjxjwjvjujtjsjrjqjpjojnjmjljkjjjijhjgjfjejdjcjbjaj`j_j^j]j\j[jZjYjXjWjVjUjTjSjRjQjPjOjNjMjLjKjJjIjHjGjFjEjDjCjBjAj@j?j>j•=jÕ