.SBTTL RT-11/RSX-11M CONVERSION SUBROUTINES .TITLE MRSXVM .NLIST BEX ; .MCALL FSRSZ$ FSRSZ$ 4 ;MAKE ROOM FOR 4 BLOCK BUFFERS .sbttl .Close RT-11 files .PSECT COD11M .MCALL CLOSE$ CLS11M:: MOV R0,-(SP) MOV AREA,R0 ;AREA CONTAINS "CHANNEL" NUMBER ASL R0 ;MAKE IT A WORD OFFSET INTO THE FDB TABLE CLOSE$ FDB(R0) ;CLOSE THE APPROPRIATE FDB MOV (SP)+,R0 RTS PC ;LEAVE WITH C-BIT FROM CLOSE .PAGE .sbttl Data Areas .PSECT DAT11M .MCALL SDAT$,RQST$,DIR$ CRFBUF: .BLKW 16. ;BUFFER FOR CREF FILE HEADER RECORD ; AND SDAT$ TO CREF CRFSND: SDAT$ CRF...,CRFBUF ;SEND DATA TO CRF... (I.E., CREF) CRFRQS: RQST$ CRF... ;REQUEST CRF... (I.E., CREF) TO RUN .PSECT COD11M CREF:: ; DIR$ #CRFSND ;SEND DATA TO THE CREF TASK ; DIR$ #CRFRQS ;REQUEST CREF TO RUN CLC RTS PC .PAGE .sbttl .CSI routines .PSECT DAT11M .MCALL GCMLB$,CSI$,CSI$SW,CSI$ND,GCML$,CSI$1,CSI$2 GCLBLK: GCMLB$ 1,,,5 ;GET COMMAND LINE WITH LUN 5 CSI$ ;DEFINE CSI$ SYMBOLS .EVEN CSIBLK: .BLKB C.SIZE ;DATA STRUCTURE FOR CSI$ CRFMSK =1 ;SET CSIBLK+C.MKW1 TO 1 IF /CR IS SPECIFIED CRFSW: CSI$SW CR,CRFMSK ;DEFINE /CR SWITCH CSI$ND GCLERR: .ASCIZ /?MRSXVM-UNABLE TO GET COMMAND LINE/ ;ERROR MESSAGES SYNERR: .ASCIZ /?MRSXVM-COMMAND SYNTAX ERROR/ .EVEN .PSECT COD11M CSI11M:: MOV R0,-(SP) ;SAVE NEDDED REGISTERS MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) CLR DV0 ;CLEAR DEVICE SWITCHES CLR DV1 ; IN CASE THIS IS NOT CLR DV2 ; THE FIRST ENTRY CLR DV3 ; INTO THIS ROUTINE GCML$ #GCLBLK,#HELLO,#HELOLN ;GET THE COMMAND LINE BCC 10$ ;BRANCH IF NO ERROR BITB #GE.EOF,GCLBLK+G.ERR ;IF NOT E-O-F BEQ 50$ ; THEN REPORT ERROR .EXIT ; ELSE EXIT CLEANLY 10$: CSI$1 #CSIBLK,GCLBLK+G.CMLD+2,GCLBLK+G.CMLD ;COMPRESS COMMAND LINE BCS 60$ ;ERROR CSI$2 #CSIBLK,OUTPUT,#CRFSW ;PARSE FOR LIST FILE SPEC BCS 60$ ;ERROR BITB #CS.WLD,CSIBLK+C.STAT ;WILD CARD SUPPLIED? BNE 60$ ;ERROR MOV #DV0,R0 JSR PC,MOV6 ;SET UP DSPT FOR FDB TST CSIBLK+C.MKW1 ;/CR SPECIFIED? BEQ 15$ INCB XREF ;YES, SET GLOBAL XREF SWITCH MOV #DV2,R0 ;COPY SAME DSPT FOR CREF FILE JSR PC,MOV6 ; INCORRECT EXT WILL BE FIXED BY OPEN 15$: BITB #CS.MOR,CSIBLK+C.STAT ;MORE FILES? BNE 20$ BITB #CS.EQU,CSIBLK+C.STAT ;"=" ENCOUNTERED? BNE 40$ BR 60$ ;ERROR 20$: CSI$2 #CSIBLK,OUTPUT ;PARSE FOR OBJECT FILE SPEC BCS 60$ ;ERROR BITB #CS.WLD,CSIBLK+C.STAT ;WILD CARD SUPPLIED? BNE 60$ ;ERROR MOV #DV1,R0 JSR PC,MOV6 ;SET UP DSPT FOR FDB BITB #CS.EQU,CSIBLK+C.STAT ;"=" SHOULD BE ENCOUNTERED BEQ 60$ ;ERROR IF NOT 40$: CSI$2 #CSIBLK,INPUT ;PARSE FOR INPUT FILE SPEC BCS 60$ ;ERROR BITB #CS.WLD,CSIBLK+C.STAT ;WILD CARD SUPPLIED? BNE 60$ ;ERROR MOV #DV3,R0 JSR PC,MOV6 ;SET UP DSPT FOR FDB BITB #CS.MOR,CSIBLK+C.STAT ;MORE FILES? BNE 60$ ;ONLY ONE IS ALLOWED BR 100$ ;LEAVE WITH SUCCESS 50$: .PRINT #GCLERR ;GCML$ FAILURE .EXIT ;EXIT CLEANLY 60$: .PRINT #SYNERR ;VARIOUS SYNTAX ERRORS 90$: SEC ;INDICATE ERROR TO THE CALLER BR 110$ 100$: CLC ;SUCCESS 110$: MOV (SP)+,R3 ;RESTORE REGS MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTS PC ;RETURN MOV6: MOV R0,R3 ;SAVE ADDR OF DEVICE AREA TST (R0)+ ;POINT TO NEXT WORD OF DEVICE AREA MOV #6,R1 ;MOVE DSPT TO DEVICE AREA MOV #CSIBLK+C.DSDS,R2; FROM ADDR IN CSI BLK 10$: MOV (R2)+,(R0)+ BEQ 15$ ;SET DEVICE SWITCH IF INC (R3) ;ANY PORTION OF DSPT IS NON-ZERO 15$: SOB R1,10$ ;MOVE ALL SIX WORDS OF DSPT RTS PC .PAGE .PSECT COD11M FCSERR: MOV R0,-(SP) ;SAVE NEDDED REGS MOV R1,-(SP) MOV R2,-(SP) MOVB F.ERR(R0),R1 ;PUT FCS ERROR CODE IN R1 MOV R2,R0 ;PUT ERROR MSG ADDR IN R0 CLR R2 ;SUPPRESS LEADING ZEROES JSR PC,$CBDSG ;CONVERT TO ASCII FOR ERROR MSG MOVB #'.,(R0) ;INSERT DECIMAL POINT IN ERROR MSG MOV (SP)+,R2 ;RESTORE REGS MOV (SP)+,R1 MOV (SP)+,R0 RTS PC .PAGE .PSECT DAT11M .MCALL GTSK$,GTIM$ GTSK: GTSK$ CRFBUF ;USED TO GET OUR REAL TASK NAME IN ; RAD50 IN THE 1ST TWO WORDS OF CRFBUF GTIM: GTIM$ CRFBUF+6 ;PUT CURRENT TIME AFTER TASK ID ; ( WHICH EQUALS 1 FOR "MACRO-11") .PSECT COD11M INICRF:: MOV R1,-(SP) ;SAVE NEEDED REGISTERS MOV R2,-(SP) MOV R3,-(SP) DIR$ #GTSK ;PUT TASK NAME IN CRFBUF MOV #1,CRFBUF+4 ;TASK ID IS "1" DIR$ #GTIM ;GET CURRENT TIME CLR CRFBUF+16. ;SET CREF SPOOL FLAG FOR NO SPOOLING MOV #18.,R2 ;OUTPUT CREF HEADER RECORD MOV #CRFBUF,R3 10$: MOVB (R3)+,R1 JSR PC,XOUT SOB R2,10$ MOV #FDBDV0+F.FNB,R2;POINT TO FILE NAME BLOCK FOR LISTING MOV #CRFBUF,R3 ;CRFBUF WILL SOON CONTAIN SEND PACKET MOV N.FNAM(R2),(R3)+;RAD50 LISTING FILE NAME (9 BYTES) MOV N.FNAM+2(R2),(R3)+ MOV N.FNAM+4(R2),(R3)+ MOV N.FTYP(R2),(R3)+;RAD50 LISTING FILE TYPE (2 BYTES) MOV N.FVER(R2),(R3)+;BINARY LISTING FILE VERSION (2 BYTES) MOV N.DID(R2),(R3)+;RAD50 LISTING FILE DIRECTORY ID MOV N.DID+2(R2),(R3)+ ;(9 BYTES) MOV N.DID+4(R2),(R3)+ MOV N.DVNM(R2),(R3)+;ASCII LISTING FILE DEVICE (2 BYTES) MOVB N.UNIT(R2),(R3)+;BINARY LISTING FILE UNIT (1 BYTE) CLRB (R3)+ ;DO NOT SPOOL LISTING MOV FDBDV2+F.FNB+N.FVER,(R3)+ ;CREF FILE VERSION NUMBER CLR (R3)+ ;SPOOLING DEVICE (SPOOLING WILL NOT) CLR (R3) ;SPOOLING UNIT NUMBER (BE DONE) ;CRFBUF NOW CONTAINS SEND PACKET MOV (SP)+,R3 ;RESTORE REGS MOV (SP)+,R2 MOV (SP)+,R1 RTS PC .PAGE .PSECT DAT11M .MCALL FDBDF$,FDAT$A,FDRC$A,NMBLK$,OPEN$ ; TABLES OF APPROPRIATE VALUES FOR THE FOUR OPENS IN THE CMD LINE FDB: .WORD FDBDV0 ;FDB ADDRESS FOR LIST FILE .WORD FDBDV1 ;FDB ADDRESS FOR OBJ FILE .WORD FDBDV2 ;FDB ADDRESS FOR CREF FILE .WORD FDBDV3 ;FDB ADDRESS FOR SRC FILE LUN: .WORD 1 ;LUN FOR LIST FILE .WORD 2 ;LUN FOR OBJ FILE .WORD 3 ;LUN FOR CREF FILE .WORD 4 ;LUN FOR SRC FILE FACC: .WORD FO.WRT ;OPEN LIST FILE FOR WRITE .WORD FO.WRT ;OPEN OBJ FILE FOR WRITE .WORD FO.WRT ;OPEN CREF FILE FOR WRITE .WORD FO.RD ;OPEN SRC FILE FOR READ DFNB: .WORD DFNB1 ;DEFAULTS FOR LIST FILE .WORD DFNB2 ;DEFAULTS FOR OBJ FILE .WORD DFNB3 ;DEFAULTS FOR CREF FILE .WORD DFNB4 ;DEFAULTS FOR SRC FILE FDBDV0: FDBDF$ ;FDB FOR LIST FILE FDAT$A R.VAR FDRC$A ,BUF0 FDBDV1: FDBDF$ ;FDB FOR OBJ FILE FDAT$A R.VAR FDRC$A ,BUF1 FDBDV2: FDBDF$ ;FDB FOR CREF FILE FDAT$A R.FIX,,512. FDRC$A FD.RAN,XBUF FDBDV3: FDBDF$ ;FDB FOR SRC FILE FDRC$A ,BUF3 DFNB1: NMBLK$ M65,LST ;DEFAULT LIST FILE IS "M65.LST" DFNB2: NMBLK$ M65,OBJ ;DEFAULT OBJ FILE IS "M65.OBJ" DFNB3: NMBLK$ M65,CRF ;DEFAULT CREF FILE IS "M65.CRF" DFNB4: NMBLK$ M65,SRC ;DEFAULT SRC FILE IS "M65.SRC" OPNERR: .ASCII /OPEN ERROR ON / OPNTYP: .ASCII /XXXX/ .ASCII / FILE, FCS ERROR CODE = / OFCSER: .ASCIZ / / .EVEN CRFEXT: .RAD50 /CRF/ ;EXTENSION FOR CREF FILE .PSECT COD11M OPN11M::MOV R0,-(SP) ;SAVE NEEDED REGISTERS MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV AREA,R1 ;GET "CHANNEL" NUMBER ASL R1 ;MAKE IT A WORD OFFSET MOV AREA+2,R2 ;GET DEVICE AREA ADDR ADD #2,R2 ;POINT TO DSPT MOV FDB(R1),R0 ;PUT FDB ADDRESS IN R0 MOVB LUN(R1),F.LUN(R0);SET LUN NUMBER IN FDB MOVB FACC(R1),F.FACC(R0) ;SET DESIRED FILE ACCESS MODE ;R2 ALREADY POINTS TO DSPT MOV DFNB(R1),R3 ;POINT R3 TO DEFAULT FILE NAME BLOCK MOV R1,-(SP) ;SAVE POINTER TO OPEN TABLES MOV R0,R1 ;NOW POINT R1 TO FDB FILE NAME BLOCK ADD #F.FNB,R1 JSR PC,.PARSE ;FILL IN FILE NAME BLOCK CMP AREA+2,#DV2 ;IF THIS IS THE CREF FILE BNE 10$ MOV CRFEXT,N.FTYP(R1) ;THEN ASSURE CORRECT CREF EXTENSION 10$: MOV (SP)+,R1 ;RESTORE POINTER TO OPEN TABLES JSR PC,.OPFNB ;OPEN FILE BY FILE NAME BLOCK BCC 20$ ;IF NO ERROR, BRANCH ASL R1 ;POINT INTO ERROR TABLE MOV ERRFIL(R1),OPNTYP ;PRINT OPEN FAILURE ERROR MSG MOV ERRFIL+2(R1),OPNTYP+2 MOV #OFCSER,R2 ;CONVERT FCS ERROR CODE TO ASCII JSR PC,FCSERR .PRINT #OPNERR SEC ;AND RETURN WITH C-BIT SET BR 30$ 20$: CLC ;SUCCESS 30$: MOV (SP)+,R3 ;RESTORE REGS MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTS PC .PAGE .PSECT DAT11M .MCALL QIOW$S IOSB: .BLKW 2 ;IO STATUS BLOCK FOR QIOW$S SPACE =040 ;ASCII SPACE CHARACTER DOLLAR =044 ;ASCII DOLLAR CHARACTER .PSECT COD11M PRT11M::MOV R0,-(SP) ;SAVE NEEDED REGISTERS MOV R1,-(SP) MOV R2,-(SP) MOV AREA,R0 ;POINT R0 AT INPUT STRING CLR R1 ;R1 COUNTS CHARACTERS FOR QIOW$ 5$: TSTB (R0)+ BEQ 10$ ;IF CHAR IS ZERO, GENERATE BMI 20$ ;IF CHAR IS 200, DO NOT GENERATE INC R1 ;COUNT CHARCTERS IN STRING BR 5$ 10$: MOVB #SPACE,R2 ;PUT PROPER CONTROL CHAR IN R2 BR 30$ 20$: MOVB #DOLLAR,R2 30$: QIOW$S #IO.WLB,#5,#5,,#IOSB,, ;QIO TO THE TERMINAL BCS 60$ CMP #IS.SUC,IOSB ;CHECK FOR SUCCESSFUL COMPLETION BEQ 50$ SEC ;IF NOT, INDICATE ERROR TO CALLER BR 60$ 50$: CLC ;SUCCESS 60$: MOV (SP)+,R2 ;RESTORE REGS MOV (SP)+,R1 MOV (SP)+,R0 RTS PC .PAGE .PSECT DAT11M .MCALL GET$ ERRFIL: .ASCII /LIST/ .ASCII /OBJ / .ASCII /CREF/ .ASCII /SRC / .ODD INPERR: .ASCII /INPUT ERROR ON / INTYP: .ASCII /XXXX/ .ASCII / FILE, FCS ERROR CODE = / IFCSER: .ASCIZ / / .EVEN .PSECT COD11M RED11M:: ;R0 IS NOT SAVED SINCE IT IS AN OUTPUT MOV R1,-(SP) ;SAVE NEEDED REGISTERS MOV R2,-(SP) MOV AREA,R1 ;R1 POINTS TO "CHANNEL" NUMBER CMP #2,R1 ;CROSS-REFERENCE FILE? BNE 5$ INC AREA+6 ;YES, MAKE BLOCK NUMBER 11M-COMPATIBLE MOV AREA+6,FDBDV2+F.RCNM+2 ;AND PLACE IT IN THE FDB 5$: ASL R1 ;MAKE "CHANNEL" NUMBER INTO A WORD OFFSET GET$ FDB(R1),AREA+2,AREA+4 ;GET THE NEXT INPUT RECORD BCS 10$ ;ERROR MOV FDB(R1),R0 ;POINT R0 AT FDB MOV F.NRBD(R0),R0 ;GET RECORD SIZE IN R0 MOV AREA+2,R1 ;POINT R1 TO RECORD BUFFER ADD R0,R1 ;R1 NOW POINT TO END OF RECORD MOVB #15,(R1) ;PUT AT EOR FOR COMPATIBILITY INC R0 ;ACCOUNT FOR IN RECORD SIZE BR 20$ ;LEAVE SUCCESSFULLY 10$: CMPB #IE.EOF,F.ERR(R0) ;EOF? BEQ 15$ ;IF SO, SET R0=0 AND EXIT ASL R1 ;POINT INTO ERRFILE TABLE MOV ERRFIL(R1),INTYP;ELSE SET UP INPUT I/O ERROR MSG MOV ERRFIL+2(R1),INTYP+2 MOV #IFCSER,R2 ;CONVERT FCS ERROR CODE TO ASCII JSR PC,FCSERR .PRINT #INPERR ;PRINT ERROR MSG JMP XITCLS ;AND CLOSE ALL FILES BEFORE EXITING 15$: CLR R0 ;REC SIZE=0 AT EOF SEC BR 30$ 20$: CLC ;SUCCESS 30$: MOV (SP)+,R2 ;RESTORE REGS MOV (SP)+,R1 RTS PC .PAGE .PSECT COD11M .MCALL DELET$,CLOSE$ SRS11M::MOV R0,-(SP) ;SAVE NEEDED REGISTERS DELET$ #FDBDV0 ;DELETE ALL OUTPUT FILES DELET$ #FDBDV1 DELET$ #FDBDV2 CLOSE$ #FDBDV3 ;CLOSE INPUT FILE MOV (SP)+,R0 ;RESTORE REGS RTS PC .PAGE .PSECT DAT11M .EVEN BUF: .BLKB 80. ;TERMINAL LINE BUFFER BUFPOS: .WORD 0 ;BUFFER POINTER (I.E., COLUMN NUMBER-1) .PSECT COD11M TIO11M::CLR BUFPOS ;CLEAR TTY BUFFER POSITION POINTER QIOW$S #IO.RLB,#5,#5,,#IOSB,,<#BUF,#80.> ;GET LINE FROM THE TERMINAL BCS 20$ ;ERROR CMPB #IS.SUC,IOSB ;CHECK FOR SUCCESSFUL IO COMPLETION BEQ 10$ SEC ;ERROR BR 20$ 10$: MOV IOSB+2,R0 ;PUT I/O TRANSFER COUNT IN R0 CLC ;SUCCESS 20$: RTS PC TTY11M::MOV BUFPOS,R0 ;PUT CHAR POSITION IN R0 MOVB BUF(R0),R0 ;PUT CHARACTER FROM BUFFER IN R0 INC BUFPOS ;POINT TO NEXT CHARACTER IN BUFFER RTS PC .PAGE .PSECT DAT11M OUTERR: .ASCII /OUTPUT ERROR ON / OUTTYP: .ASCII /XXXX/ .ASCII / FILE, FCS ERROR CODE = / WFCSER: .ASCIZ / / .PSECT COD11M .MCALL PUT$ WRT11M::MOV R0,-(SP) ;SAVE NEEDED REGISTERS MOV R1,-(SP) MOV R2,-(SP) MOV AREA,R1 ;R1 POINTS TO "CHANNEL" NUMBER CMP #2,R1 ;CROSS-REFERENCE FILE? BNE 5$ INC AREA+6 ;YES, MAKE BLOCK NUMBER 11M-COMPATIBLE MOV AREA+6,FDBDV2+F.RCNM+2 ;AND PLACE IT IN THE FDB 5$: ASL R1 ;MAKE "CHANNEL" NUMBER INTO A WORD OFFSET PUT$ FDB(R1),AREA+2,AREA+4 ;OUTPUT THE RECORD BCC 10$ ;EXIT IF NO I/O ERROR ASL R1 ;POINT INTO ERRFILE TABLE MOV ERRFIL(R1),OUTTYP ;ELSE PRINT APPROPRIATE ERROR MSG MOV ERRFIL+2(R1),OUTTYP+2 MOV #WFCSER,R2 ;CONVERT FCS ERROR CODE TO ASCII JSR PC,FCSERR .PRINT #OUTERR BR XITCLS ;AND CLOSE ALL FILES BEFORE EXITING 10$: MOV (SP)+,R2 ;RESTORE REGS MOV (SP)+,R1 MOV (SP)+,R0 RTS PC XITCLS: .CLOSE #0 ;CLOSE ALL FILES .CLOSE #1 .CLOSE #2 .CLOSE #3 .EXIT ;AND EXIT CLEANLY .END