.TITLE MISH - Mish files .IDENT /1.1/ .ENABL LC .ENABL AMA .NLIST BEX .MCALL ALUN$S, DIR$, EXIT$S, EXST$S, GTSK$, QIOW$, QIOW$S .MCALL GCMLB$, GCML$, FDAT$A, FDRC$A, FDOP$A, FDBF$A .MCALL CLOSE$, FINIT$, FSRSZ$, FDBDF$, NMBLK$, READ$, WAIT$ .MCALL GET$, PUT$, WRITE$ .MCALL FCSBT$, FDOFF$, FHDOF$, NBOFF$ .MCALL DIR$, GET$, GTIM$, QIOW$ .MCALL ISTAT$, STATE$, TRAN$ .MCALL CSI$ .MCALL FDAT$R, FDOP$R, FDRC$R, FDBF$R, FDBK$R .MCALL ASTX$S FCSBT$ FDOFF$ DEF$L FHDOF$ DEF$L NBOFF$ DEF$L BELL = 7 HT = 9. LF = 10. CR = 13. ESC = 27. SPACE = 32. DELETE = 127. CVTSET = 37. MAXDUP = 37 MAXCNT = 77 CMDSIZ = 256. RECSIZ = 78. ERRSIZ = 80. FILSIZ = 128. BLKSIZ = 512. BUFSIZ = 78. bufend = blksiz*2 INLUN = 2 INEFN = 2 OUTLUN = 3 OUTEFN = 3 TILUN = 4 TIEFN = 4 TOLUN = 5 TOEFN = 5 ERRLUN = 6 ERREFN = 6 .MACRO ERRMSG LABEL,MSG .NCHR $$$, .PSECT $ERMSG,RO,D,REL,CON LABEL: .ASCII \MSG\ .EVEN .PSECT MOV #LABEL,R1 MOV #$$$,R2 CALL OUTMSG .ENDM B.MBON = 200 B.NDUP = 100 B.NBLA = 40 DEPTH = 2 PRADR: .ASCII "MISH>" PRLEN = .-PRADR .EVEN B.CMNT == 1 B.IFIL == 2 B.OFIL == 4 B.TOT == 10 B.CTRC == 100000 STATUS::.WORD 0 O.RADR == 2 O.RLEN == 4 O.BADR == 6 O.BLEN == 10 O.MAX == 12 O.STAT == 14 ARGBLK::.BYTE 6,0 .WORD RECADR .WORD RECLEN .WORD BUFADR .WORD BUFLEN .WORD MAXSIZ .WORD ASTAT RECADR::.BLKB BLKSIZ RECLEN::.WORD 0 BUFADR::.BLKB BLKSIZ*2 BUFLEN::.WORD 0 WRKBUF::.BLKB BLKSIZ*2 WRKLEN::.WORD BLKSIZ*2 MAXSIZ::.WORD BUFEND ASTAT:: .WORD 0 GCLBLK::GCMLB$ DEPTH,,CMDBUF,TILUN,,CMDSIZ ATTACH: QIOW$ IO.ATA,TOLUN,TOEFN,,TIOSB,,<,,CTRLC> GETTSK: GTSK$ TSKBUF TSKBUF: .BLKW 16. VAXFLG::.WORD 0 TIOSB:: .BLKW 2 ISTAT:: .BLKW 2 OSTAT:: .BLKW 2 IVBN:: .BLKW 2 OVBN:: .BLKW 2 SFFBY:: .WORD 0 STBLK:: .BLKW 5 FIELDW::.WORD 0 TYPOPR::.WORD 0 SCBADR::.WORD 0 RECNUM::.WORD 0 BLKNUM::.WORD 0 ORGLEN::.WORD 0 COMLEN::.WORD 0 INPTR:: .WORD INFIL OUTPTR::.WORD OUTFIL CMDBUF::.BLKB CMDSIZ ERRBUF::.BLKB ERRSIZ FMTBUF::.BLKB RECSIZ*2 INFIL:: .BLKB FILSIZ .BYTE 377 .EVEN OUTFIL::.BLKB FILSIZ .BYTE 377 .EVEN FSRSZ$ 5 TIFDB:: FDBDF$ FDAT$A R.VAR,FD.CR,,, FDRC$A ,CMDBUF,CMDSIZ FDOP$A TILUN,,DEFNB,FO.RD FDBF$A TIEFN,CMDSIZ,, TOFDB:: FDBDF$ FDAT$A R.VAR,FD.CR,,, FDRC$A ,FMTBUF,RECSIZ FDOP$A TOLUN,,OUTNB,FO.WRT FDBF$A TOEFN,RECSIZ,, ERRFDB::FDBDF$ FDAT$A R.VAR,FD.CR,,, FDRC$A ,ERRBUF,ERRSIZ FDOP$A ERRLUN,,ERRNB,FO.WRT FDBF$A ERREFN,ERRSIZ,, INFDB:: FDBDF$ OUTFDB::FDBDF$ OUTNB:: NMBLK$ MISH,OUT,,SY,0 ERRNB: NMBLK$ MISH,ERR,,SY,0 DEFNB:: NMBLK$ MISH,MIS,,SY,0 ANLNB:: NMBLK$ MISH,ANL,,SY,0 DEFS: .ASCIZ ".MIS" ANLS: .ASCIZ ".ANL" TISTR: .ASCIZ "TI0:" SYSIN: .ASCIZ "SYS$INPUT:" SYSOUT: .ASCIZ "SYS$OUTPUT:" SYSERR: .ASCIZ "SYS$ERROR:" .EVEN MISH:: ALUN$S #TILUN,#"TI,#0 MOV @#.FSRPT,R0 TST A.DFUI(R0) BNE 10$ FINIT$ 10$: DIR$ #GETTSK CALL CHKDIR CLR VAXFLG CMPB #5,TSKBUF+G.TSSY BNE 20$ MOV #-1,VAXFLG 20$: MOV #ERRFDB,R0 MOV #TISTR,R1 TST VAXFLG BEQ 25$ MOV #SYSERR,R1 25$: CALL OPENW BCS 100$ MOV #TIFDB,R0 MOV #TISTR,R1 TST VAXFLG BEQ 30$ MOV #SYSIN,R1 30$: CALL OPENR BCS 100$ CLOSE$ MOV #TOFDB,R0 MOV #TISTR,R1 TST VAXFLG BEQ 40$ MOV #SYSOUT,R1 40$: CALL OPENW BCS 100$ BITB #FD.TTY,F.RCTL(R0) BEQ 50$ DIR$ #ATTACH CALL CHKDIR 50$: MOV #GCLBLK,R0 BISB #GE.CON,G.MODE(R0) TST VAXFLG BEQ 60$ MOV F.DFNB(R0),R1 MOV #^RCOM,N.FTYP(R1) 60$: BR GETCMD 100$: CALL FILERR JMP EXISEV .ENABL LSB GETCMD::MOV #GCLBLK,R0 GCML$ R0,#PRADR,#PRLEN BCC GOTCMD CMPB #GE.EOF,G.ERR(R0) BNE 10$ JMP EXIT 10$: CMPB #GE.IOR,G.ERR(R0) BEQ 20$ CMPB #GE.OPR,G.ERR(R0) BEQ 20$ CMPB #GE.BIF,G.ERR(R0) BEQ 30$ CMPB #GE.MDE,G.ERR(R0) BNE 20$ ERRMSG TOOMNY,<%MISH-F-TOOMANY, maximum @ file depth exceeded.> JMP EXIT 20$: CALL FILERR BR GETCMD SYNERR:: 30$: ERRMSG SYNMSG,<%MISH-E-SYNERR, syntax error in command line.> BR GETCMD .DSABL LSB GOTCMD::MOV #GCLBLK,R0 MOV G.CMLD(R0),R3 BEQ GETCMD MOV G.CMLD+2(R0),R4 MOV R4,R0 ADD R3,R0 CLRB (R0) MOV #INFIL,INPTR MOV #OUTFIL,OUTPTR MOV #B.TOT,STATUS MOV #3,FIELDW CLR TYPOPR CLR RECNUM CLR BLKNUM CLR ORGLEN CLR COMLEN MOV #<<400*1>+1>,R1 MOV #KEYWRD,R2 MOV #START,R5 CALL .TPARS BCC GOGO JMP SYNERR .ENABL LSB GOGO:: BIT #B.CMNT,STATUS BEQ 10$ JMP GETCMD 10$: BIT #B.IFIL,STATUS BNE 15$ ERRMSG NOIFIL,<%MISH-E-NOIFIL, you must specify an input file.> JMP GETCMD 15$: CALL SETUP MOV #INFDB,R0 MOV #INFIL,R1 CALL OPENR BCC 20$ CALL FILERR JMP GETCMD 20$: TST TYPOPR BLE 25$ CALL SETHDR BCS 40$ BR 30$ 25$: BMI 30$ MOV INFDB+F.EFBK+2,R1 NEG R1 MOV R1,OUTFDB+F.CNTG 30$: BIT #B.OFIL,STATUS BNE 35$ TST TYPOPR BGT 35$ BLT 33$ MOV #OUTFIL,R0 MOV #INFIL,R1 31$: MOVB (R1)+,(R0) BEQ 35$ CMPB (R0)+,#'. BNE 31$ DEC R0 MOV #DEFS,R1 CALL MOVEC BR 35$ 33$: MOV #OUTFIL,R0 MOV #TISTR,R1 TST VAXFLG BEQ 34$ MOV #SYSOUT,R1 34$: CALL MOVEC 35$: MOV #OUTFDB,R0 MOV #OUTFIL,R1 CALL OPENW BCC DISPATCH CALL FILERR 40$: CALL CLOFIL JMP GETCMD .DSABL LSB .WORD ANALYZ DISTBL: .WORD COMP .WORD DECOMP DISPATCH:: MOV TYPOPR,R0 CALL @DISTBL(R0) CALL CLOFIL JMP GETCMD analyz::return COMP:: MOV #ARGBLK,R5 MOV #BUFADR,O.BADR(R5) CLR @O.BLEN(R5) CALL WRTHDR BCC CLOOP RETURN .ENABL LSB CLOOP:: BIT #B.CTRC,STATUS BNE 100$ MOV #INFDB,R0 READ$ R0 BCS 90$ WAIT$ R0 BCS 90$ INC BLKNUM 10$: MOV #ARGBLK,R5 MOV #WRKBUF,O.BADR(R5) CLR @O.BLEN(R5) MOV F.BKDS(R0),@O.RLEN(R5) MOV F.BKDS+2(R0),O.RADR(R5) ADD @O.RLEN(R5),ORGLEN 20$: CALL COMPRESS MOV #WRKBUF,R0 MOV @O.BLEN(R5),R3 MOV #BUFADR,R4 CALL DOF2T MOV #BUFADR,R1 ADD R3,COMLEN CALL EIGHTY 40$: BR CLOOP 90$: 95$: CMPB F.ERR(R0),#IE.EOF BEQ 100$ CALL FILERR 100$: CALL WRTTOT RETURN .DSABL LSB PADBUF: CMP @O.BLEN(R5),#BUFSIZ BHIS 10$ MOVB #B.MBON,@O.BADR(R5) INC O.BADR(R5) INC @O.BLEN(R5) BR PADBUF 10$: RETURN CLOFIL::JSR R2,$SAVVR MOV #INFDB,R0 TST F.BDB(R0) BEQ 20$ CLOSE$ R0 MOV #OUTFDB,R0 TST F.BDB(R0) BEQ 10$ TST TYPOPR BGT 10$ CALL .TRNCL BR 20$ 10$: CLOSE$ R0 20$: RETURN EXISUC::MOV #EX$SUC,R0 BR EXST EXIWAR::MOV #EX$WAR,R0 BR EXST EXIERR::MOV #EX$ERR,R0 BR EXST EXISEV::MOV #EX$SEV,R0 EXST:: EXST$S R0 EXIT$S EXIT:: CALL CLOFIL CLOSE$ #TIFDB CLOSE$ #TOFDB CLOSE$ #ERRFDB EXIT$S COMPRESS:: CALL $SAVAL MOV O.RADR(R5),R0 MOV @O.RLEN(R5),R1 MOV O.BADR(R5),R2 MOV @O.BLEN(R5),R3 10$: CALL MAKSCB 20$: TST R1 BEQ 100$ CALL CHKEND BCS 100$ CLR -(SP) MOVB (R0)+,(SP) DEC R1 BEQ 30$ CMPB (R0),(SP) BEQ 40$ 30$: MOVB (SP)+,(R2)+ INC R3 INC R4 CMP R4,#MAXCNT BLO 20$ CALL FINSCB BR 10$ 40$: CALL FINSCB BCS 50$ CALL MAKSCB 50$: BICB #B.NDUP,@SCBADR INC R4 60$: CMPB (R0),(SP) BNE 70$ INC R0 INC R4 DEC R1 BEQ 70$ CMP R4,#MAXDUP BLO 60$ 70$: BISB R4,@SCBADR MOVB (SP)+,(R2) CMPB (R2),#SPACE BEQ 10$ 80$: INC R2 INC R3 BISB #B.NBLA,@SCBADR BR 10$ 100$: CALL FINSCB BCS 110$ CALL MAKSCB 110$: CLRB @SCBADR TST R1 BEQ 120$ MOVB #B.MBON,@SCBADR 120$: MOV R0,O.RADR(R5) MOV R1,@O.RLEN(R5) MOV R2,O.BADR(R5) MOV R3,@O.BLEN(R5) CLR @O.STAT(R5) CALL CHKEND BCS 130$ MOV #1,@O.STAT(R5) 130$: RETURN CHKEND::CMP R3,@O.MAX(R5) BHIS 90$ CLC BR 100$ 90$: SEC 100$: RETURN FINSCB::TST R4 BEQ 90$ BISB R4,@SCBADR BR 100$ 90$: SEC 100$: RETURN MAKSCB::MOV R2,SCBADR MOVB #B.MBON!B.NDUP,(R2)+ INC R3 CLR R4 CALL CHKEND RETURN DECOMP::CALL $SAVAL MOV #ARGBLK,R5 MOV #BUFADR,O.BADR(R5) CLR @O.BLEN(R5) MOV #WRKBUF,O.RADR(R5) CALL WRTATR BCC DLOOP RETURN .ENABL LSB DLOOP:: BIT #B.CTRC,STATUS BNE 100$ CALL GETM BCS 100$ MOV O.RADR(R5),R4 CALL DOT2F BCS 100$ MOV O.RADR(R5),R0 10$: DEC @O.RLEN(R5) MOVB (R0)+,R2 BEQ 60$ BPL 80$ BIC #^C377,R2 CMP #B.MBON,R2 BEQ DLOOP MOV R2,R3 BIC #^C77,R3 BITB #B.NDUP,R2 BNE 50$ BIC #^C37,R3 MOVB #SPACE,R4 BITB #B.NBLA,R2 BEQ 20$ MOVB (R0)+,R4 DEC @O.RLEN(R5) 20$: MOVB R4,@O.BADR(R5) INC O.BADR(R5) INC @O.BLEN(R5) SOB R3,20$ BR 10$ 50$: MOVB (R0)+,@O.BADR(R5) DEC @O.RLEN(R5) INC O.BADR(R5) INC @O.BLEN(R5) SOB R3,50$ BR 10$ 60$: CMP @O.BLEN(R5),#BLKSIZ BEQ 70$ ERRMSG BADCNT,<%MISH-F-BADCNT, bad output block size.> BR 100$ 70$: CALL WRTBLK BCS 100$ ADD @O.BLEN(R5),ORGLEN MOV #BUFADR,O.BADR(R5) CLR @O.BLEN(R5) JMP DLOOP 80$: ERRMSG INVSCB,<%MISH-F-INVSCB, invalid string control byte.> BR 100$ 100$: MOV #OUTFDB,R0 MOV SFFBY,F.FFBY(R0) BEQ 110$ SUB #1,F.EFBK+2(R0) SBC F.EFBK(R0) 110$: CALL WRTTOT RETURN .DSABL LSB WRTBLK::JSR R2,$SAVVR INC BLKNUM MOV #OUTFDB,R0 WRITE$ R0 BCS 90$ WAIT$ R0 BCC 100$ 90$: CALL FILERR 100$: RETURN ERROFF = 2 BUFOFF = 4 FLGOFF = 6 FACOFF = 10 STAOFF = 12 ALTOFF = 14 TXTBIT = 1 MIDBIT = 2 SEVBIT = 4 FACBIT = 10 ERRBLK: .BYTE 6,0 .WORD ERRCOD .WORD -1 .WORD MSGFLG .WORD FACNAM .WORD STACOD .WORD -1 ERRCOD: .WORD 0 FACNAM: .ASCIZ %MISH% .EVEN MSGFLG: .WORD TXTBIT!MIDBIT!SEVBIT!FACBIT STACOD: .WORD 0 .ENABL LSB CHKDIR::MOV R0,-(SP) BCC 30$ MOV $DSW,R0 BR 20$ CHKERR::BCS CHKDIR MOV R0,-(SP) 10$: MOVB TIOSB,R0 BPL 30$ BIC #^C377,R0 20$: CALL WRTERR 30$: MOV (SP)+,R0 RETURN .DSABL LSB WRTERR::CALL $SAVAL MOV R0,ERRCOD MOV #ERRBLK,R5 CALL GETMSG MOV BUFOFF(R5),R1 MOV @STAOFF(R5),R2 BMI 10$ CALL OUTMSG 10$: SEC RETURN OUTMSG::JSR R2,$SAVVR TST ERRFDB+F.BDB BEQ 10$ PUT$ #ERRFDB,R1,R2 RETURN 10$: ALUN$S #ERRLUN,#"TI,#0 BCS 20$ QIOW$S #IO.WLB!TF.CCO,#ERRLUN,#ERREFN,,#TIOSB,, 20$: RETURN RFHBLK::.BYTE -1,5 .WORD HDRBUF+O.UIC .BYTE -4,40 .WORD HDRBUF+O.UFAT .WORD 0 WFHBLK::.BYTE 2,3 .WORD HDRBUF+O.PROT .BYTE 4,40 .WORD HDRBUF+O.UFAT .WORD 0 RFHDR: QIOW$ IO.RAT,INLUN,INEFN,,ISTAT,,<,RFHBLK,,,,> WFHDR: QIOW$ IO.WAT,OUTLUN,OUTEFN,,OSTAT,,<,WFHBLK,,,,> GTIME: GTIM$ DATBUF DATBUF: .BLKW 8. T2FHDR::.WORD 0 HDRSIZ = 80. HDRBUF::.BLKB HDRSIZ O.FILE == 0. O.FNAM == O.FILE+22. O.FTYP == O.FNAM+6 O.FVER == O.FTYP+2 O.UIC == O.FVER+2 O.PROT == O.UIC+2 O.FCHA == O.PROT+2 O.UCHA == O.FCHA O.SCHA == O.UCHA+1 O.UFAT == O.FCHA+2 O.RTYP == O.UFAT O.FORG == O.RTYP O.RATT == O.RTYP+1 O.RSIZ == O.RATT+1 O.HIBK == O.RSIZ+2 O.HVBN == O.HIBK O.EFBK == O.HIBK+4 O.HEOF == O.EFBK O.FFBY == O.EFBK+4 O.BKSZ == O.FFBY+2 O.HDSZ == O.BKSZ+1 O.MRS == O.HDSZ+1 O.DEQ == O.MRS+2 O.DATE == O.UFAT+32. GETHDR::GET$ #INFDB,#WRKBUF,#HDRSIZ BCC 5$ CALL FILERR 5$: JSR R2,$SAVVR MOV #ARGBLK,R5 MOV F.NRBD(R0),R1 MOV #WRKBUF,R2 ADD R1,R2 GET$ #INFDB,R2,#HDRSIZ BCS 10$ MOV #2,RECNUM ADD F.NRBD(R0),R1 MOV R1,R3 10$: RETURN SETHDR::CALL $SAVAL CALL GETHDR BCS 100$ MOV #WRKBUF,R0 MOV #HDRBUF,R4 MOV #-1,T2FHDR CALL DOT2F BCS 100$ CLR T2FHDR MOV #HDRBUF,R0 MOV R0,R2 BIT #B.OFIL,STATUS BNE 20$ MOV R0,R1 MOV #OUTFIL,R0 CALL MOVEC BIS #B.OFIL,STATUS MOV #HDRBUF,R0 20$: MOV #OUTFDB,R1 MOVB O.RTYP(R0),F.RTYP(R1) MOVB O.RATT(R0),F.RATT(R1) MOV O.RSIZ(R0),F.RSIZ(R1) MOV O.HIBK+2(R0),R2 BITB #UC.CON,O.FCHA(R0) BNE 50$ NEG R2 50$: MOV R2,F.CNTG(R1) MOV #-5.,F.ALOC(R1) MOV O.FFBY(R0),SFFBY CLC 100$: RETURN WRTATR::JSR R2,$SAVVR DIR$ #WFHDR CALL CHKDIR BCS 100$ MOVB OSTAT,R0 BPL 100$ BIC #^C377,R0 CALL WRTERR 100$: RETURN WRTHDR::JSR R2,$SAVVR MOV #HDRBUF,R0 MOV #HDRSIZ/2,R1 10$: CLR (R0)+ SOB R1,10$ DIR$ #RFHDR CALL CHKDIR BCS 50$ MOVB ISTAT,R0 BPL 20$ BIC #^C377,R0 CALL WRTERR BR 50$ 20$: MOV #HDRBUF+O.FILE,R0 MOV INFDB+F.FNAM,R1 CALL $C5TA MOV INFDB+F.FNAM+2,R1 BEQ 30$ CALL $C5TA MOV INFDB+F.FNAM+4,R1 BEQ 30$ CALL $C5TA 30$: CMPB #SPACE,-(R0) BEQ 30$ INC R0 MOVB #'.,(R0)+ MOV INFDB+F.FTYP,R1 BEQ 35$ CALL $C5TA 35$: CMPB #SPACE,-(R0) BEQ 35$ INC R0 CLRB (R0) MOV #INFDB,R0 MOV #HDRBUF,R1 MOV F.FNAM(R0),O.FNAM(R1) MOV F.FNAM+2(R0),O.FNAM+2(R1) MOV F.FNAM+4(R0),O.FNAM+4(R1) MOV F.FTYP(R0),O.FTYP(R1) MOV F.FVER(R0),O.FVER(R1) DIR$ #GTIME CALL CHKDIR BCS 40$ MOV #HDRBUF+O.DATE,R0 MOV #DATBUF+G.TIYR,R1 CALL $DAT CLRB (R0) 40$: MOV #HDRBUF,R0 MOV #HDRSIZ,R3 MOV #BUFADR,R4 CALL DOF2T MOV #BUFADR,R1 CALL EIGHTY 50$: RETURN .MACRO H HLPTXT .NCHR $$$, .PSECT $HLPS,RO,D,REL,CON $$$MSG=. .ASCII \HLPTXT\ .PSECT .WORD $$$MSG .WORD $$$+2 .ENDM HLPTBL: H <> H H H H H H H <> H H <> H < input_file/switches output_file/switches> H <> H H <> H < /COMPRESS - Used to compress files. This is the default mode.> H < /DECOMPRESS - Used to decompress files into their original file format.> H <> .WORD 0,0 HELP:: CALL $SAVAL MOV #TOFDB,R0 MOV #HLPTBL,R3 10$: MOV (R3)+,R1 BEQ 20$ MOV (R3)+,R2 CALL WRTFDB BR 10$ 20$: RETURN ISTAT$ STATE, KEYWRD STATE$ START TRAN$ <';>,$EXIT,,B.CMNT,STATUS TRAN$ <'!>,$EXIT,,B.CMNT,STATUS TRAN$ <'?>,$EXIT,HELP,B.CMNT,STATUS TRAN$ $LAMDA STATE$ SW1 TRAN$ '/,SW2 TRAN$ $LAMDA,SKIP1 STATE$ SW2 TRAN$ !SWTBL,SW1 STATE$ SKIP1 TRAN$ $BLANK,ILOOP TRAN$ $LAMDA STATE$ ILOOP TRAN$ $BLANK,ISW1 TRAN$ '/,ISW2 TRAN$ $ANY,ILOOP,SIFILE,B.IFIL,STATUS TRAN$ $EOS,$EXIT STATE$ ISW1 TRAN$ '/,ISW2 TRAN$ $LAMDA,ISW3 STATE$ ISW2 TRAN$ !SWTBL,ISW1 STATE$ ISW3 TRAN$ $BLANK,OLOOP TRAN$ $LAMDA STATE$ OLOOP TRAN$ $BLANK,OSW1 TRAN$ '/,OSW2 TRAN$ $ANY,OLOOP,SOFILE,B.OFIL,STATUS TRAN$ $EOS,$EXIT STATE$ OSW1 TRAN$ '/,OSW2 TRAN$ $LAMDA,OSW3 STATE$ OSW2 TRAN$ !SWTBL,OSW1 STATE$ OSW3 TRAN$ $BLANK,FIN1 TRAN$ $LAMDA STATE$ FIN1 TRAN$ $EOS,$EXIT STATE$ SWTBL TRAN$ !NEGSW,$EXIT TRAN$ "COMPRESS",$EXIT,COACT TRAN$ "DECOMPRESS",$EXIT,DEACT TRAN$ "HELP",$EXIT,HELP,B.CMNT,STATUS TRAN$ "TOTALS",$EXIT,,B.TOT,STATUS STATE$ NEGSW TRAN$ '- STATE$ TRAN$ "TOTALS",$EXIT,NOTOT STATE$ COACT: CLR TYPOPR RETURN DEACT: MOV #2,TYPOPR RETURN NOTOT: BIC #B.TOT,STATUS RETURN SIFILE::TSTB @INPTR BMI FAIL MOVB .PCHAR,@INPTR INC INPTR CLRB @INPTR RETURN SOFILE::TSTB @OUTPTR BMI FAIL MOVB .PCHAR,@OUTPTR INC OUTPTR CLRB @OUTPTR RETURN FAIL: ADD #2,(SP) RETURN CTRLC:: BIS #B.CTRC,STATUS TST (SP)+ ASTX$S CVTDEC::JSR R5,.SAVR1 MOV #030012,R2 CALL $CBTA RETURN FILERR::JSR R2,$SAVVR MOV F.ERR(R0),R0 CALL WRTERR RETURN MOVEC:: MOVB (R1)+,(R0)+ BNE MOVEC DEC R0 RETURN DOF2T:: CALL $SAVAL MOV R5,-(SP) CLR R5 BIT #1,R3 BEQ 5$ MOV R0,R1 ADD R3,R1 CLRB (R1) INC R3 5$: ASR R3 10$: MOV (R0)+,R1 MOV R1,R2 BIC #^C77,R2 ADD #CVTSET,R2 MOVB R2,(R4)+ ASH #-6,R1 MOV R1,R2 BIC #^C77,R2 ADD #CVTSET,R2 MOVB R2,(R4)+ ASH #-6,R1 MOV R1,R2 BIC #^C17,R2 ADD #CVTSET,R2 MOVB R2,(R4)+ ADD #3,R5 SOB R3,10$ MOV R5,R3 MOV (SP)+,R5 MOV R3,@O.BLEN(R5) RETURN .ENABL LSB DOT2F:: CALL $SAVAL CLR WRKLEN 10$: CLR R2 DIV #3,R2 MOV R2,R3 ASL R2 ADD R2,WRKLEN CMP WRKLEN,#BUFEND BLE 20$ ERRMSG EXCBUF,<%MISH-F-EXCBUF, exceeded output buffer.> SEC BR 50$ 20$: MOVB (R0)+,R2 SUB #CVTSET,R2 BIC #^C77,R2 MOV R2,R1 MOVB (R0)+,R2 SUB #CVTSET,R2 BIC #^C77,R2 ASH #6,R2 ADD R2,R1 MOVB (R0)+,R2 SUB #CVTSET,R2 BIC #^C17,R2 ASH #12.,R2 ADD R2,R1 MOV R1,(R4)+ SOB R3,20$ TST T2FHDR BLT 50$ MOV #WRKBUF,R0 MOV WRKLEN,R1 CALL EORSCB BCC 50$ CALL GETM BCC 10$ ERRMSG UNEOF,<%MISH-F-UNEOF, unexpected end of file encountered.> SEC 50$: MOV WRKLEN,@O.RLEN(R5) RETURN .DSABL LSB GETM:: GET$ #INFDB,#RECADR,#RECSIZ BCS 10$ INC RECNUM ADD F.NRBD(R0),COMLEN MOV F.NRBD(R0),R3 MOV F.NRBD+2(R0),R0 CLC BR 40$ 10$: CMPB F.ERR(R0),#IE.EOF BEQ 20$ CALL FILERR 20$: SEC 40$: RETURN EORSCB:: CALL $SAVAL 10$: CLC BITB #B.MBON,(R0) BEQ 100$ MOVB (R0),R2 BITB #B.NDUP,(R0) BNE 20$ CLR R2 BITB #B.NBLA,(R0) BEQ 30$ INC R2 BR 30$ 20$: BIC #^C77,R2 30$: INC R2 SUB R2,R1 BLE 90$ ADD R2,R0 BR 10$ 90$: SEC 100$: RETURN FILNAM: .ASCIZ "File: " TOTBLK: .ASCIZ ", total number of blocks = " TOTREC: .ASCIZ ", total number of records = " .EVEN DOPUT:: CALL $SAVAL PUT$ #OUTFDB,R1,R2 BCC 10$ CALL FILERR 10$: RETURN WRTOUT::JSR R2,$SAVVR INC RECNUM MOV @O.BLEN(R5),R2 CALL DOPUT 10$: RETURN WRTTOT::JSR R2,$SAVVR BIT #B.TOT,STATUS BEQ 100$ MOV #FMTBUF,R0 MOV #FILNAM,R1 CALL MOVEC MOV #OUTFIL,R1 CALL MOVEC MOV #TOTBLK,R1 CALL MOVEC MOV BLKNUM,R1 CALL CVTDEC MOV #TOTREC,R1 CALL MOVEC MOV RECNUM,R1 CALL CVTDEC MOV #FMTBUF,R1 MOV R0,R2 SUB R1,R2 MOV #TOFDB,R0 CALL WRTFDB 100$: RETURN WRTFDB::JSR R2,$SAVVR BITB #FD.TTY,F.RCTL(R0) BEQ 10$ CMP R2,#80. BLT 10$ MOV #IO.WLB,R0 QIOW$S R0,#TOLUN,#TOEFN,,#TIOSB,, CALL CHKERR BR 100$ 10$: PUT$ R0,R1,R2 BCC 100$ CALL FILERR 100$: RETURN EIGHTY:: CALL $SAVAL MOV @O.BLEN(R5),R2 10$: MOV R2,R3 BEQ 30$ SUB #BUFSIZ,R2 BLT 20$ MOV #BUFSIZ,@O.BLEN(R5) CALL WRTOUT ADD #BUFSIZ,R1 BR 10$ 20$: MOV R3,@O.BLEN(R5) CALL WRTOUT 30$: RETURN CSI$ CR = 15 CSIBLK: .BLKB C.SIZE .EVEN OPENR:: TSTB F.FACC(R0) BNE OPEN MOVB #FO.RD!FA.SHR,F.FACC(R0) BR OPEN OPENW:: TSTB F.FACC(R0) BNE OPEN MOVB #FO.WRT!FA.NSP,F.FACC(R0) OPEN: CALL $SAVAL TST F.BDB(R0) BEQ 10$ CLOSE$ R0 10$: CLR F.DSPT(R0) CLR F.ERR(R0) BISB #IE.BNM,F.ERR(R0) CALL CHKCSI BCS 20$ MOV R0,R1 ADD #F.FNB,R1 MOV F.DSPT(R0),R2 MOV F.DFNB(R0),R3 CALL .PARSE BCS 20$ CALL .OPFNB 20$: RETURN CHKCSI: CALL $SAVAL MOV R0,R4 MOV #C.SIZE/2,R2 MOV #CSIBLK,R3 10$: CLR (R3)+ SOB R2,10$ MOV #CSIBLK,R0 MOV R1,C.CMLD+2(R0) 20$: CMPB (R1),#CR BEQ 30$ TSTB (R1)+ BNE 20$ DEC R1 30$: SUB C.CMLD+2(R0),R1 BEQ 50$ MOV R1,C.CMLD(R0) CALL .CSI1 BCS 60$ MOVB #CS.OUT,(R0) CALL .CSI2 BCS 60$ 40$: MOV #CSIBLK+C.DSDS,F.DSPT(R4) BITB #CS.MOR!CS.WLD,CSIBLK+C.STAT BNE 60$ 50$: CLC RETURN 60$: SEC RETURN .WORD IRECIO ITABLE: .WORD IBLKIO .WORD IRECIO .WORD ORECIO OTABLE: .WORD ORECIO .WORD OBLKIO .WORD ANLNB ONBTBL: .WORD DEFNB .WORD OUTNB SETUP:: JSR R2,$SAVVR MOV TYPOPR,R1 MOV #INFDB,R0 CALL CLRFDB CALL @ITABLE(R1) MOV #OUTFDB,R0 CALL CLRFDB MOV ONBTBL(R1),R2 CALL @OTABLE(R1) 100$: RETURN CLRFDB: JSR R2,$SAVVR MOV #S.FDB/2,R1 10$: CLR (R0)+ SOB R1,10$ RETURN IRECIO: FDAT$R R0,,,#RECSIZ,, FDRC$R R0,,#RECADR,#RECSIZ FDOP$R R0,#INLUN,,#DEFNB,#FO.RD!FA.SHR FDBF$R R0,#INEFN,#BLKSIZ,, RETURN ORECIO: FDAT$R R0,#R.VAR,#FD.CR,,#-10.,#-10. FDRC$R R0,,#BUFADR,#RECSIZ FDOP$R R0,#OUTLUN,,R2,#FO.WRT!FA.NSP FDBF$R R0,#OUTEFN,#BLKSIZ,, RETURN IBLKIO: CLR IVBN MOV #1,IVBN+2 FDRC$R R0,#FD.RWM,, FDBK$R R0,#RECADR,#BLKSIZ,#IVBN,#INEFN,#ISTAT, FDOP$R R0,#INLUN,,#DEFNB,#FO.RD!FA.SHR MOV #STBLK,F.STBK(R0) RETURN OBLKIO: CLR OVBN MOV #1,OVBN+2 FDRC$R R0,#FD.RWM,, FDBK$R R0,#BUFADR,#BLKSIZ,#OVBN,#OUTEFN,#OSTAT, FDOP$R R0,#OUTLUN,,R2,#FO.WRT!FA.NSP RETURN .MCALL ALUN$S, DIR$, QIOW$, QIOW$S .MCALL FILIO$, NMBLK$, IOERR$ FILIO$ IOERR$ MAXFCS = 90. MAXDIR = 99. MAXSUC = 10. MAXRMS = 00. MAXBAS = 74. ERROFF = 2 BUFOFF = 4 FLGOFF = 6 FACOFF = 10 STAOFF = 12 ALTOFF = 14 TXTBIT = 1 MIDBIT = 2 SEVBIT = 4 FACBIT = 10 DIRMSG = 0 FCSMSG = 1 SUCMSG = 2 RMSMSG = 3 BASMSG = 4 MAXMSG = BASMSG + 1 MSGTBL: .WORD MAXDIR,0,RSXFNB MSGSIZ = .-MSGTBL .WORD MAXFCS,128.,RSXFNB .WORD MAXSUC,256.,RSXFNB .WORD MAXRMS,276.,RSXFNB .WORD MAXBAS,0,BASFNB TOTTY: .WORD 0 .MOLUN::.WORD 0 OUTBUF: .BLKW 50. DEFFLG: .WORD TXTBIT!MIDBIT!SEVBIT!FACBIT DIRFNB: NMBLK$ 001002,DIR,,LB,0 .=DIRFNB+N.DID .WORD 4,4 .=DIRFNB+S.FNB MSGPTR: .WORD RSXFNB RSXFNB: NMBLK$ RSX11M,MSG BASFNB: NMBLK$ BASIC,MSG MSGDPB: QIOW$ ,,,,MSGSB,,<,,,,,> MSGSB: .BLKW 2 BLKBUF: .BLKB 512. SUCTBL: .WORD IS.PND,1 .WORD IS.SUC,2 .WORD IS.TMO,3 .WORD IS.CC,4 .WORD IS.EOT,5 .WORD IS.TAB,6 .WORD IS.CR,7 .WORD IS.ESC,8. .WORD IS.ESQ,9. .WORD IS.PES,10. .WORD 0,0 NOMSG: .ASCII %F% .ASCIZ %NOMSG% .ASCII %no such message, code = % CODE: .BLKB 10. MSGFIL: .ASCII %F% .ASCIZ %MSGFIL% .ASCII %message file error % CODE1: .ASCII % % .ASCII %actual error % CODE2: .ASCII % % .EVEN SIGNAL:: MOV @2(R5),ERRCOD MOV #ERRBLK,R5 BR PUTMSG GETMSG:: CLR TOTTY CMP BUFOFF(R5),#-1 BNE ERROR PUTMSG:: MOV #-1,TOTTY ERROR: CALL $SAVAL CMP STAOFF(R5),#-1 BEQ 10$ CLR @STAOFF(R5) 10$: CMP ALTOFF(R5),#-1 BEQ 15$ MOV @ALTOFF(R5),R3 CMP R3,#MAXMSG BLT 20$ 15$: TSTB @ERROFF(R5) BMI 17$ JMP SUCESS 17$: MOV #DIRMSG,R3 TST @ERROFF(R5) BMI 20$ MOV #FCSMSG,R3 20$: MUL #MSGSIZ,R3 ADD #MSGTBL,R3 MOV 2(R3),R4 MOV 4(R3),MSGPTR MOV (R3),R3 MOVB @ERROFF(R5),R1 BPL 25$ NEG R1 25$: CMP R1,R3 BGT WNOMSG 30$: MOV R1,R0 ADD R4,R0 CALL GERMSG BCS NOMFIL JMP CHKMSG WNOMSG: MOV #CODE,R0 CALL BADMSG MOV #NOMSG,R2 JMP CHKMSG NOMFIL: MOV #CODE1,R0 MOV $DSW,R1 BMI 10$ MOVB MSGSB,R1 BMI 10$ MOVB @ERROFF(R5),R1 BR WNOMSG 10$: CALL BADMSG MOVB #',,(R0) MOVB @ERROFF(R5),R1 MOV #CODE2,R0 CALL BADMSG MOV #MSGFIL,R2 JMP CHKMSG BADMSG: CLR R2 CALL $CBDSG MOVB #'.,(R0)+ CLRB (R0) CMP STAOFF(R5),#-1 BEQ 10$ MOV #-1,@STAOFF(R5) 10$: RETURN SUCESS: MOV @ERROFF(R5),R1 MOV #SUCTBL,R0 10$: CMP R1,(R0)+ BEQ 20$ TST (R0)+ BNE 10$ BR WNOMSG 20$: MOV (R0),R0 MOV #SUCMSG,R3 MUL #MSGSIZ,R3 ADD #MSGTBL,R3 ADD 2(R3),R0 MOV 4(R3),MSGPTR CALL GERMSG BCS NOMFIL BR CHKMSG CHKMSG: CMP FLGOFF(R5),#-1 BEQ 5$ MOV @FLGOFF(R5),R3 BIT DEFFLG,R3 BNE 10$ 5$: MOV DEFFLG,R3 10$: MOV BUFOFF(R5),R1 CMP R1,#-1 BNE 20$ MOV #OUTBUF,R1 MOV #-1,TOTTY 20$: MOV R1,R4 MOV FACOFF(R5),R0 CMP R0,#-1 BNE 30$ MOV #FACNAM,R0 30$: BIT #FACBIT,R3 BEQ 50$ MOVB #'%,(R4)+ 40$: MOVB (R0)+,(R4)+ BNE 40$ DEC R4 MOVB #'-,(R4)+ 50$: BIT #SEVBIT,R3 BEQ 55$ MOVB (R2),(R4)+ MOVB #'-,(R4)+ 55$: INC R2 BIT #MIDBIT,R3 BEQ 70$ 60$: MOVB (R2)+,(R4)+ BNE 60$ DEC R4 MOVB #',,(R4)+ MOVB #' ,(R4)+ BR 80$ 70$: TSTB (R2)+ BNE 70$ 80$: BIT #TXTBIT,R3 BEQ 100$ MOV R4,R0 90$: MOVB (R2)+,(R4)+ BNE 90$ DEC R4 BIT #MIDBIT!SEVBIT!FACBIT,R3 BNE 100$ BICB #40,(R0) 100$: TST TOTTY BNE 200$ CMP STAOFF(R5),#-1 BEQ 110$ SUB R1,R4 MOV R4,@STAOFF(R5) 110$: RETURN 200$: SUB R1,R4 210$: ALUN$S .MOLUN,#"TI,#0 QIOW$S #IO.WVB!TF.CCO,.MOLUN,.MOLUN,,#TIOSB,, BCS 999$ TSTB TIOSB BMI 999$ RETURN 999$: MOV $DSW,R0 MOVB TIOSB,R1 MOVB @ERROFF(R5),R3 IOT GERMSG: CALL $SAVAL MOV .MOLUN,MSGDPB+Q.IOLU MOV .MOLUN,MSGDPB+Q.IOEF MOV MSGPTR,R1 MOV #DIRFNB,R4 CALL FNDMSG BCC 30$ MOV #^RMIL,N.FNAM(R4) MOV #^RLER,N.FNAM+2(R4) MOV #"ER,N.DVNM(R4) CLR (R4) CLR N.DID(R1) CALL FNDMSG BCS 90$ 30$: MOV #IO.ACR,MSGDPB+Q.IOFN CALL CLIOPL MOV R1,(R5) MOV #100000,8.(R5) CALL DOQIO BCS 90$ MOV R0,R4 DEC R4 CLC ROR R4 ASR R4 ASR R4 INC R4 MOV #IO.RVB,MSGDPB+Q.IOFN CALL CLIOPL MOV #BLKBUF,(R5)+ MOV #512.,(R5)+ CMP (R5)+,(R5)+ MOV R4,(R5) CALL DOQIO ROR R4 MOV #IO.DAC,MSGDPB+Q.IOFN CALL CLIOPL MOV R1,(R5) CALL DOQIO BCS 90$ ROL R4 BCS 90$ MOV R0,R2 DEC R2 BIC #177770,R2 ASH #6,R2 ADD #BLKBUF,R2 TSTB (R2) BEQ 90$ MOV R2,6(SP) RETURN 90$: SEC RETURN FNDMSG: CALL $SAVAL ALUN$S .MOLUN,N.DVNM(R4),N.UNIT(R4) BCS 90$ MOV MSGPTR,R1 TST N.DID(R1) BNE 20$ TST (R4) BNE 10$ CALL FIND BCS 90$ 10$: MOV (R4)+,N.DID(R1) MOV (R4)+,N.DID+2(R1) MOV (R4)+,N.DID+4(R1) 20$: TST (R1) BNE 90$ MOV R1,R4 CALL FIND 90$: RETURN FIND: MOV #IO.FNA,MSGDPB+Q.IOFN CALL CLIOPL MOV R4,10.(R5) CALL DOQIO RETURN CLIOPL: MOV #MSGDPB+24.,R5 MOV R0,-(SP) MOV #6,R0 10$: CLR -(R5) SOB R0,10$ MOV (SP)+,R0 RETURN DOQIO: DIR$ #MSGDPB BCS 10$ TSTB MSGSB BPL 10$ SEC 10$: RETURN .END MISH