.TITLE DSLIB.MAC .IDENT /V1.0/ ; ;***LIBRARY OF RSX11M SYSTEM CALL SUBROUTINES*** ; ;THESE SUBROUTINES ARE IN MACRO FORM SUCH THAT THEY CAN BE REFERENCED ;THROUGH A .MCALL DIRECTIVE AND DEFINED BY NAMING THE SUBROUTINE. ;FOR EXAMPLE, THE SUBROUTINE 'WRITE' COULD BE INCLUDED IN A PROGRAM ;BY INCLUDING THE FOLLOWING STATEMENTS IN THE SOURCE: ; .MCALL WRITE ; WRITE ;AT THIS POINT, THE FOLLOWING .PSECT IS GENERATED: ; .PSECT SUBR,RO,I,GBL,REL,CON ;AND THE SUBROUTINE CODE IS INSERTED. (ALL OF THESE MACROS HAVE AN OPTIONAL ;ARGUMENT WHICH IS THE NAME OF THE INVOKING PSECT.) ;IN SOME CASES, AN ADDITIONAL PSECT IS GENERATED (E.G. FOR FDB GENERATION) ;ONCE THE SUBROUTINE HAS BEEN DEFINED VIA THE MACRO CALL, THE SUBROUTINE ;MAY BE USED BY THE STANDARD CALL (E.G. CALL WRITE). ; ; DANIEL STEINBERG ; ; ; ; ; ; ; ;FIRST, SOME GENERAL PURPOSE MACROS: ; .MACRO PUSH X MOV X,-(SP) ;PUSH ONTO STACK .ENDM ; .MACRO POP X .IF NB,X MOV (SP)+,X ;POP OFF STACK .IFF TST (SP)+ ;POP ONE VALUE .ENDC .ENDM ; ; .MACRO SWSTK ADDR EMT 376 ;SWITCH TO SYSTEM STACK ***RSXV3.1*** .WORD ADDR ;BRANCH DESTINATION WHEN RETURN ENCOUNTERED .ENDM .MACRO FINIT PSECT .PSECT SUBR,RO,I,GBL,REL,CON ; FINIT -- INITIALIZE FCS FILE SYSTEM .MCALL FINIT$ FINIT:: FINIT$ RETURN .PSECT PSECT .ENDM ; ; .MACRO TIODEF PSECT .PSECT SUBDAT,RW,D,GBL,REL,CON ; TIODEF -- DEFINE TILUN,TIEFN,IOSTAT FOR READ/WRITE TO TERMINAL ;IOSTAT DEFINED IN A DATA PSECT CALLED SUBDAT TILUN==1 TIEFN==1 IOSTAT:: .BLKW 2 ;I/O STATUS BLOCK .PSECT PSECT .ENDM .MACRO READ PSECT .PSECT SUBR,RO,I,GBL,REL,CON ; READ -- READ FROM TERMINAL ON TILUN ; INPUTS: TILUN DEFINED AS LUN FOR TERMINAL ; TIEFN DEFINED AS EVENT FLAG FOR TERMINAL I/O ; IOSTAT DEFINED AS TWO-WORD BUFFER ADDRESS ; R0 -- DESTINTAION BUFFER ADDRESS ; R1 -- NUMBER OF CHARS TO READ ; OUTPUT: INPUT STRING IN BUFFER AT R0 ; PTR TO TERMINATOR OR ERROR CODE IN R1 ; I/O STATUS AT IOSTAT .MCALL QIOW$S .IIF NDF,IOSTAT,.ERROR ;TIODEF MISSING READ:: QIOW$S #IO.RVB,#TILUN,#TIEFN,,#IOSTAT,, MOV R0,R1 ;SET BUFFER ADDRESS ADD IOSTAT+2,R1 ;SET END OF BUFFER CMPB IOSTAT,#IS.SUC ;NORMAL COMPLETION? BEQ 1$ MOVB IOSTAT,(R1) ;NO...SET ERROR CODE (COULD BE 366 FOR ^Z) RETURN 1$: MOVB IOSTAT+1,(R1) ;SET TERMINATOR CHAR INTO BUFFER RETURN .PSECT PSECT .ENDM ; ; .MACRO WRITE PSECT .PSECT SUBR,RO,I,GBL,REL,CON ; WRITE -- WRITE TO TERMINAL ON TILUN ; WRIT1 -- WRITE TO TERMINAL WITH KNOWN BUFFER LENGTH ; INPUTS: TILUN,TIEFN,IOSTAT DEFINED ; R0 - ADDRESS OF STRING TO WRITE (ASCIZ FOR WRITE) ; (WRIT1) R1 - COUNT OF CHARS TO WRITE ; OUTPUT: I/O STATUS IN IOSTAT .MCALL QIOW$S .IIF NDF,IOSTAT,.ERROR ;TIODEF MISSING WRITE:: MOV R0,R1 1$: TSTB (R1)+ ;FIND END OF ASCIZ BUFFER BNE 1$ SUB R0,R1 ;CALCULATE SIZE OF BUFFER DEC R1 ;DON'T INCLUDE THE ZERO WRIT1:: QIOW$S #IO.WAL,#TILUN,#TIEFN,,#IOSTAT,, RETURN .PSECT PSECT .ENDM .MACRO FILNAM PSECT .PSECT SUBR,RO,I,GBL,REL,CON ; FILNAM -- GET THE FILENAME INFORMATION FROM THE FDB AND CONVERT TO ASCII ; INPUTS: R0 - PTR TO DEST BUFFER (ALLOW 20 CHARS MAX) ; R1 - FDB ADDRESS ; OUTPUT: R0 - POSITIONED AFTER LAST CHAR ; R1 - # OF CHARACTERS CONVERTED .MCALL PUSH,POP FILNAM:: PUSH R2 ;SAVE R2 PUSH R0 ;SAVE R0 FOR FINDING STRING LENGTH PUSH F.FNB+N.FVER(R1) ;PUSH VERSION NUMBER PUSH F.FNB+N.FTYP(R1) ; AND EXTENSION PUSH F.FNB+N.FNAM+4(R1) ;AND 3 RAD50 FILENAME WORDS PUSH F.FNB+N.FNAM+2(R1) MOV F.FNB+N.FNAM(R1),R1 ;THE 1ST GOES INTO R1 NOW BEQ 10$ ; UNLESS IT'S BLANK CALL $C5TA ;CONVERT TO ASCII POP R1 ;AND GET 2ND NAME WORD CALL $C5TA ; AND CONVERT POP R1 ;GET LAST CALL $C5TA 5$: CMPB #' ,-(R0) ;SKIP BACK OVER SPACES BEQ 5$ INC R0 ;AND POINT TO 1ST FREE LOCATION 10$: POP R1 ;GET EXTENSION BEQ 15$ ; IF ANY MOVB #'.,(R0)+ CALL $C5TA ;CONVERT TO ASCII 12$: CMPB #' ,-(R0) ;SKIP BACK OVER SPACES BEQ 12$ INC R0 15$: MOVB #';,(R0)+ POP R1 ;GET VERSION NUMBER MOV #30010,R2 ;SIX DIGIT OCTAL...NO FILL CALL $CBTA ;CONVERT TO ASCII MOV R0,R1 ;GET END PTR SUB (SP)+,R1 ;CALCULATE # OF CHARS IN BUFFER POP R2 ;RESTORE R2 RETURN .PSECT PSECT .ENDM .MACRO SLAVE PSECT .PSECT SUBR,RO,I,GBL,REL,CON ; SLAVE -- SET THE TERMINAL SLAVED ; *** MODIFIED FOR V3.2 TO USE QIOW$ *** .MCALL TTSYM$ TTSYM$ SLAVE:: QIOW$S #SF.SMC,#TILUN,#TIEFN,,,,<#1$,#2> RETURN 1$: .BYTE TC.SLV,1 .PSECT PSECT .ENDM ; ; .MACRO NOSLAVE PSECT .PSECT SUBR,RO,I,GBL,REL,CON ; NOSLAVE -- SET THE TERMINAL UNSLAVED ; *** MODIFIED FOR V3.2 TO USE QIOW$ *** NOSLAVE:: QIOW$S #SF.SMC,#TILUN,#TIEFN,,,,<#1$,#2> RETURN 1$: .BYTE TC.SLV,0 .PSECT PSECT .ENDM .MACRO GET PSECT .PSECT SUBR,RO,I,GBL,REL,CON ; GET -- GET THE NEXT RECORD FROM A FILE IN MOVE MODE ; GETR - GET A RANDOM ACCESS RECORD ; INPUTS: R0 - FDB ADDRESS ; R1 - DEST BUFFER ADDRESS ; R2 - DEST BUFFER SIZE ; (GETR) R3 - RECORD NUMBER .MCALL GET$ GETR:: MOV R3,F.RCNM+2(R0) ;SET UP THE RANDOM ACCESS RECORD NUMBER GET:: GET$ R0,R1,R2 RETURN .PSECT PSECT .ENDM ; ; .MACRO PUT PSECT .PSECT SUBR,RO,I,GBL,REL,CON ; PUT -- WRITE THE NEXT RECORD TO A FILE IN MOVE MODE ; PUTR - WRITE A RANDOM ACCESS RECORD ; INPUTS: R0 - FDB ADDRESS ; R1 - SRC BUFFER ADDRESS ; R2 - SRC BUFFER SIZE ; (PUTR) R3 - RECORD NUMBER .MCALL PUT$ PUTR:: MOV R3,F.RCNM+2(R0) ;SET THE RECORD NUMBER FOR RANDOM ACCESS PUT:: PUT$ R0,R1,R2 RETURN .PSECT PSECT .ENDM .MACRO SPOOL PSECT .PSECT SUBR,RO,I,GBL,REL,CON ; SPOOL -- SPOOL A FILE TO THE LINEPRINTER ; INPUTS: R1 - PTR TO DATASET DESCRIPTOR FOR FILE TO SPOOL ; OUTPUT: CARRY SET IF ERROR (FILE NOT SPOOLED) ; R1 HAS ERROR CODE IF ERROR ; USES R0,R1 ;THIS MACRO DEFINES A DATA PSECT AS WELL AS INSTRUCTION PSECT .MCALL OPNS$R,PRINT$ SPOOL:: OPNS$R #SPFDB,#SPLUN,R1,#FD.PLC BCS 1$ PRINT$ R0 BCS 1$ RETURN 1$: TSTB F.ERR+1(R0) ;IS ERROR IN DSW? BMI 2$ ;YES...GO HANDLE MOVB F.ERR(R0),R1 ;GET ERROR CODE INTO R1 3$: SEC RETURN 2$: MOV $DSW,R1 ;GET ERROR CODE FROM DSW BR 3$ ;AND EXIT .PSECT SUBDAT,RW,D,GBL,REL,CON SPLUN==2 SPEFN==2 ;DEFINE LUN AND EVENT FLAGS FOR SPOOLING .MCALL FDBDF$,FDBF$A,FSRSZ$ SPFDB: FDBDF$ ;DEFINE THE FDB FOR SPOOLING FDBF$A SPEFN FSRSZ$ 1,,SUBDAT .PSECT PSECT .ENDM .MACRO CDTB PSECT .PSECT SUBR,RO,I,GBL,REL,CON ;CONVERT ASCII DATA TO BINARY VALUE ; INPUTS: R0 - INPUT STRING PTR ; OUTPUT: R0 - UPDATED PTR (ONE CHAR PAST TERMINATOR) ; R1 - CONVERTED VALUE, IF ANY ; R2 - TERMINATING CHARACTER CDTB:: JMP $CDTB ;GO TO LIBRARY SUBROUTINE .PSECT PSECT .ENDM ; ; .MACRO CBTA PSECT .PSECT SUBR,RO,I,GBL,REL,CON ;CONVERT BINARY DATA TO ASCII ; INPUTS: R0 - DEST STRING PTR ; R1 - VALUE TO CONVERT ; R2 - CONVERSION MASK----BITS 0-7 OUTPUT BASE (2-10) ; BIT 8 1 IF SIGNED VALUE ; BIT 9 0 IF ZERO SUPPRESS ; BIT 10 FILL CHAR: 0-ZERO 1-BLANK ; BIT 11-15 NUMBER OF OUTPUT CHARS CBTA:: JMP $CBTA ;GO TO LIBRARY SUBROUTINE .PSECT PSECT .ENDM