.NLIST TITLE BUILD,BUILD .LIST .PAGE .SBTTL BUILD - BUILD COMMAND "A" OR "B" OR FILE NAME STRING ; BUILD.MAC 01AUG84 ; ; .ENABL LC ERASE: .BYTE 10, 40, 10 ; CODE TO ERASE LAST CHARACTER WRITTEN MES2: .ASCII <15><12>/TLK -- File name too long -- Not redirected/<15><12> LENM2=.-MES2 MES6: .ASCII <15><12>/TLK -- / .IIF DF SIGMA9 .ASCII /SIGMA9/ .IIF DF RSX11 .ASCII /PDP/ .IIF DF RSXBIN .ASCII /PDP/ .ASCII / file name too long/<15><12> LENM6=.-MES6 TRAILA: ; COMMAND "A" TRAILING STRING .IF DF RSX11 .ASCII /=TI:/ ; END OF RSX-11M COPY COMMAND .ENDC ;RSX11 .IIF DF RSXBIN .ASCII +/IN+ ; END OF BINARY INPUT COMMAND LENTRA=.-TRAILA TRAILB: ; COMMAND "B" TRAILING STRING .IF DF VAX .ASCII / TT:/ ; END OF VAX/VMS COPY COMMAND .ENDC ;VAX .IIF DF RSXBIN .ASCII +/OUT+ ; END OF BINARY OUTPUT COMMAND LENTRB=.-TRAILB .EVEN BUILD:: CMPB #177, CHAR ; IS CHARACTER A DELETE? BNE 2$ ; NO TST NAMECT ; IF YES, IS THIS FIRST INPUT CHARACTER? BNE 1$ ; NO JMP 30$ ; RETURN 1$: QIOMAC R0, #WALTIO, #ERASE, #3, Y ; ERASE LAST CHARACTER ON TERMINAL DEC NAMECT ; IGNORE LAST CHARACTER IN FNAME DEC FNPTR ; UPDATE FILE NAME POINTER JMP 30$ ; RETURN 2$: QIOMAC R0, #WALTIO, #EKOBUF ; SET UP PART OF DPB FOR WRITE MOVB CHAR, EKOBUF ; MOVE CHARACTER TO WRITE BUFFER CMPB CHAR, #15 ; END OF FILE NAME? BNE 10$ ; NO QIOMAC R0, , , #3, Y ; ECHO CHARACTER TO TERMINAL MOVB CHAR,@FNPTR ; BUFFER THE CLRB BLDFLG ; TURN OFF GENERAL BUILD FLAG TSTB BNMFLG ; ARE WE BUILDING A LOCAL FILE NAME? BNE 8$ ; YES ADD NAMECT,LENCMD ; CALCULATE LENGTH OF COMMAND INC LENCMD ; INCREMENT LENGTH OF COMMAND FOR INCB WT2FLG ; SET FLAG TO WAIT FOR COMMAND TRANSMIT TSTB BCBFLG ; ARE WE BUILDING COMMAND "B"? BNE 4$ ; YES ; ; BUILDING COMMAND "A" HERE .IF NE LENTRA ; APPEND TRAILING CMD STRING, IF ANY MOV #TRAILA,R2 ; GET START OF TRAILING CMD STRING MOV #LENTRA,R3 ; LENGTH OF TRAILING CMD STRING 3$: MOVB (R2)+,@FNPTR ; BUFFER THE CHARACTER INC FNPTR ; INCREMENT POINTER SOB R3,3$ ; LOOP MOVB #15,@FNPTR ; APPEND THE ADD #LENTRA,LENCMD ; UPDATE COMMAND LENGTH .ENDC ;LENTRA CLRB BCAFLG ; TURN OFF BUILD FLAG JSR PC,REDINP ; REDIRECT INPUT BR 30$ ; RETURN 4$: ; ; BUILDING COMMAND "B" HERE .IF DF VAX INCB WT2FLG ; ALSO IGNORE EXTRA ON VAX .ENDC ;VAX CLRB NLRFLG ; CLEAR NULL RECORD FLAG .IF NE LENTRB ; APPEND TRAILING CMD STRING, IF ANY MOV #TRAILB,R2 ; GET START OF TRAILING CMD STRING MOV #LENTRB,R3 ; LENGTH OF TRAILING CMD STRING 5$: MOVB (R2)+,@FNPTR ; BUFFER THE CHARACTER INC FNPTR ; INCREMENT POINTER SOB R3,5$ ; LOOP MOVB #15,@FNPTR ; APPEND THE ADD #LENTRB,LENCMD ; UPDATE COMMAND LENGTH .ENDC ;LENTRB CLRB BCBFLG ; TURN OFF BUILD FLAG JSR PC,REDOUT ; REDIRECT OUTPUT BR 30$ ; RETURN 8$: JSR PC,OPNFLE ; PARSE AND OPEN FILE CLRB BNMFLG ; TURN OFF BUILD FLAG TSTB HLPFLG ; IS TALK HELPING? BEQ 30$ ; NO - RETURN JSR PC,SNDCMD ; TRANSMIT COMMAND STRING BR 30$ ; RETURN 10$: QIOMAC R0, , , #1, Y ; ECHO CHARACTER TO TERMINAL CMP #31., NAMECT ; LONGER THAN ANY LEGAL FILE NAME? BEQ 20$ MOVB CHAR,@FNPTR ; APPEND CHARACTER TO COMMAND INC FNPTR ; INCREMENT COMMAND BUFFER POINTER INC NAMECT ; INCREMENT FILE NAME LENGTH BR 30$ 20$: CLRB BCAFLG ; ERROR, TURN OFF BUILD FLAGS CLRB BCBFLG CLRB BLDFLG ; TURN OFF GENERAL BUILD FLAG TSTB BNMFLG ; BUILDING LOCAL FILE NAME? BNE 25$ ; YES QIOMAC R0, , #MES6, #LENM6, Y ; WRITE MESSAGE 6 TO TERMINAL BR 30$ ; RETURN 25$: CLRB BNMFLG ; CLEAR BUILD FLAG QIOMAC R0, , #MES2, #LENM2, Y ; WRITE MESSAGE 2 TO TERMINAL 30$: RTS PC .NLIST TITLE OPNFLE,BUILD .LIST .PAGE .SBTTL OPNFLE - OPEN REDIRECTED INPUT/OUTPUT FILE ; MES3: .ASCII <15><12>/TLK -- File open error - not redirected /<15><12> LENM3=.-MES3 RDIMSG: .ASCII <15><12>/** INPUT REDIRECTED **/<15><12> LENRIM=.-RDIMSG RDOMSG: .ASCII <15><12>/** OUTPUT REDIRECTED **/<15><12> LENROM=.-RDOMSG .EVEN OPNFLE:: .IF DF RSXBIN CLR BLKPTR ; CLEAR DISK BUFFER POINTER ... ; ... TO INDICATE FILE NOT YET OPEN .ENDC ;RSXBIN CSI$1 #CSIBLK, #FNAME, NAMECT ; SQUEEZE OUT BLANKS BCS 8$ CSI$2 #CSIBLK, OUTPUT ; PARSE FILE NAME BCS 8$ CMPB #1, BNMFLG ; INPUT OR OUTPUT FILE? BNE 1$ .IF DF RSXBIN TSTB HLPFLG ; IS TALK HELPING? BEQ 10$ ; NO, NOT BINARY FILE JSR PC,OPNINP ; OPEN INPUT FILE, BINARY BR 20$ 10$: CLRB FDBIN+F.RACC ; INDICATE GET$ MODE .ENDC ;RSXBIN OPEN$R #FDBIN ; OPEN INPUT FILE 20$: BCS 8$ INCB RDIFLG ; INDICATE REDIRECTED INPUT QIOMAC R0, #WALTIO, #RDIMSG, #LENRIM, Y ; WRITE MESSAGE CLR RECCNT ; CLEAR FLAG FOR SENDING RECORDS CLR NREC ; ZERO COUNT OF RECORDS READ FROM FILE CLR NRECA ; ZERO COUNT OF RECORDS SINCE LAST MSG BR 9$ 1$: .IF DF RSXBIN TSTB HLPFLG ; OUTPUT FILE, IS TALK HELPING? BNE 5$ ; IF TALK IS HELPING, BINARY FILE CLRB F.RACC+FDBOUT ; SET FILE FOR RECORD MODE .ENDC ;RSXBIN OPEN$W #FDBOUT ; OPEN OUTPUT FILE BCS 8$ 5$: INCB RDOFLG ; INDICATE REDIRECTED OUTPUT QIOMAC R0, #WALTIO, #RDOMSG, #LENROM, Y ; WRITE MESSAGE BR 9$ 8$: QIOMAC R0, #WALTIO, #MES3, #LENM3, Y ; WRITE MES3 TO TERMINAL CLRB HLPFLG ; CLEAR HELPING FLAG 9$: RTS PC .NLIST TITLE SNDCMD,BUILD .LIST .PAGE .SBTTL SNDCMD - SEND COMMAND "A" OR "B" ; SNDCMD:: MOV CMDPTR,R1 ; ADDRESS OF COMMAND MOV LENCMD,R2 ; GET LENGTH OF COMMAND 5$: MOVB (R1)+,CHAR ; GET CHARACTER JSR PC,SENDPR ; SEND IT TO PORT SOB R2,5$ ; LOOP RTS PC .NLIST TITLE OPNBIN,BUILD .LIST .IF DF RSXBIN .PAGE .SBTTL OPNBIN - OPEN FILE FOR BINARY TRANSFER (OUTPUT) ; OPNBIN:: MOV #FDBOUT,R0 ; GET ADDRESS OF OUTPUT FDB MOV #BLKBUF,R3 ; GET ADDRESS OF DISK BUFFER ... ; ... WHICH CONTAINS FILE ATTRIBUTES MOVB (R3)+,F.RTYP(R0) ; MOVE ATTRIBUTES INTO FDB MOVB (R3)+,F.RATT(R0) MOV (R3)+,F.RSIZ(R0) MOV (R3)+,FFBY ; SAVE F.FFBY FOR LATER, OR IT ... ; ... WOULD BE OVERWRITTEN MOV (R3)+,R2 ; GET F.HIBK SWAB R2 ; ADJUST FOR CALL TO .EXTND BIC #377,R2 MOV (R3)+,R1 MOV (R3)+,EFBK ; SAVE F.EFBK MOV (R3)+,EFBK+2 TSTB (R3) ; CHECK CONTIGUOUS FLAG BEQ 10$ ; IF NOT CONTIGUOUS BIS #205,R2 ; SET CONTIGUOUS FOR .EXTND 10$: MOVB #FD.RWM,F.RACC(R0) ; SET MODE TO READ/WRITE OPEN$W R0 ; OPEN OUTPUT FILE BCS 30$ CALL .EXTND ; EXTEND FILE TO FINAL SIZE BCS 20$ RTS PC ; 20$: CALL .DLFNB ; FILE ERROR, DELETE IT 30$: QIOMAC R0,#WALTIO,#MES3,#LENM3,Y ; OUTPUT ERROR MESSAGE CLRB RDOFLG ; TURN OFF REDIRECTED OUTPUT CLRB HLPFLG RTS PC .ENDC ;RSXBIN .NLIST TITLE OPNINP,BUILD .LIST .IF DF RSXBIN .PAGE .SBTTL OPNINP - OPEN FILE FOR BINARY TRANSFER (INPUT) ; OPNINP:: MOVB #FD.RWM,FDBIN+F.RACC ; SET FILE MODE TO READ/WRITE OPEN$R #FDBIN ; OPEN FILE BCS 30$ MOV #BLKBUF+512.-20,R1 ; COPY ATTRIBUTES TO END OF BUFFER MOV R1,BLKPTR ; UPDATE DISK BUFFER POINTER MOVB F.RTYP(R0),(R1)+ ; COPY ATTRIBUTES MOVB F.RATT(R0),(R1)+ MOV F.RSIZ(R0),(R1)+ MOV F.FFBY(R0),(R1)+ MOV F.HIBK(R0),(R1)+ MOV F.HIBK+2(R0),(R1)+ CMP F.EFBK(R0),F.HIBK(R0) ; CHECK IF EOF IS < SIZE BHI 20$ ; IF > BLO 10$ ; IF < CMP F.EFBK+2(R0),F.HIBK+2(R0) ; CHECK LOW WORD BHIS 20$ ; IF >= 10$: MOV F.EFBK(R0),-4(R1) ; REPLACE SIZE WITH LAST BLOCK # MOV F.EFBK+2(R0),-2(R1) 20$: MOV F.EFBK(R0),(R1)+ ; SAVE END OF FILE BLOCK # MOV F.EFBK+2(R0),(R1)+ CLR (R1)+ ; CLEAR CONTIGUOUS FLAG ... ; ... (NO WAY TO KNOW IF FILE IS) CLC 30$: RTS PC .ENDC ;RSXBIN .NLIST TITLE ,BUILD .LIST ; .END