;DOWN LINE LOAD TASK (DLT.MAC) ; ; PAUL ELKINS 15-SEPT-84 ; ; LOS ALAMOS NATIONAL LAB. ; PO BOX 1663 MS-J957 ; LOS ALAMOS NM 87545 ; 505 667 3502 ; ; ; ;COPYRIGHT, 1984,THE REGENTS OF THE UNIVERSITY OF CALIFORNIA. ;THIS SOFTWARE WAS PRODUCED UNDER A U.S. GOVERNMENT CONTRACT ;(W-7405-ENG-36) BY THE LOS ALAMOS NATIONAL LABORATORY,WHICH ;IS OPERATED BY THE UNIVERSITY OF CALIFORNIA FOR THE U.S. ;DEPARTMENT OF ENERGY. THE U.S. GOVERNMENT IS LICENSED TO USE, ;REPRODUCE, AND DISTRIBUTE THIS SOFTWARE. PERMISSION IS GRANTED ;TO THE PUBLIC TO COPY AND USE THIS SOFTWARE WITHOUT CHARGE, ;PROVIDED THAT THIS NOTICE AND ANY STATEMENT OF AUTHORSHIP ARE ;REPRODUCED ON ALL COPIES. NEITHER THE GOVERNMENT NOR THE ;UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ;ANY LIABILITY OR RESPONSIBILITY FOR THE USE OF THIS SOFTWARE. ; .TITLE DLT ; .LIST MEB ; .MCALL DIR$,GTSK$S,QIOW$,OPEN$R,QIO$ .MCALL READ$,CLOSE$,WAIT$,FINIT$ .MCALL FSRSZ$,FDBDF$,FDRC$A,FDBK$A .MCALL FDOP$A,LBLDF$ .MCALL EXIT$S,SRDA$S,WTLO$S,SETF$S,ASTX$S .MCALL SDAT$,RCVD$,MRKT$,CMKT$S ; LBLDF$ ;DEFINE TASK IMAGE OFFSETS ; L1=1 ;DISK LOGICAL UNIT NUMBER L2=2 ;ETHERNET LOGICAL UNIT NUMBER L3=3 ;CONSOLE LOG LOGICAL UNIT NUMBER EF1=1 ;DISK EVENT FLAG EF2=2 ;ETHERNET RECEIVE EVENT FLAG EF3=3 ;ETHERNET XMIT EVENT FLAG EF4=4 ;PRINT EVENT FLAG NUMBER RECEF=15. ;RECEIVE DATA AST EVENT FLAG MKTEF=14. ;MARKTIME EVENT FLAG RDMSK=20002 ;RECIEVE PACKET/TIMEOUT MASK DLYMSK=60000 ;REC. DATA/TIMEOUT EVENT FLAG MASK XSRC=6 ;ETHERNET SOURCE FIELD OFFSET XTYP=14 ;ETHERNET TYPE CODE OFFSET XFLG=16 ;FLAG/START ADDRESS OFFSET XNBLK=16 ;NUMBER OF MEMORY BLOCKS OFFSET XTSK=20 ;MY TASKNAME OFFSET IN BYTES HDRSZ=XTSK+4 ;HEADER SIZE IN BYTES RPWC=40 ;REPLY WORD COUNT SBWC=412 ;SEND BLOCK WORD COUNT LDTYP=3 ;LOAD TYPE CODE NBUF=8. ;NUMBER OF DISK BUFFERS BUFSZ=1000 ;DISK BUFFER SIZE IN BYTES FOFF=7 ;OFFSET TO FILE NAME IN BOOT.DAT RECSZ=24. ;BOOT.DAT RECORD SIZE IN BYTES RECOFF=BUF+510. ;OFFSET TO NEXT RECORD NUMBER FNAMSZ=17. ;FILE NAME MAXIMUM LENGTH(BYTES) XQCONR=1 ;XQ: CONNECT REQUEST TYPE CODE(TASK-TASK) ; START: FINIT$ SRDA$S #RECAST ;SPECIFY RECEIVE DATA AST DIR$ #SDAT ;SYNCRONIZE WITH LWT... DIR$ #TMO ;SETUP TIMEOUT DELAY WTLO$S 0,#DLYMSK ;WAIT FOR REC. DATA/TIMEOUT CMKT$S #MKTEF ;CANCEL MARKTIME(USED LATTER) DIR$ #RCVD ;GET CONNECT DATA BLOCK CMP #1,$DSW ;VALID RECEIVE ? BEQ 1$ ;YES MOV #CB1,R0 ;GET MESSAGE CONTROL BLOCK JMP ERROR ;CONNECT FAILED 1$: OPEN$R #FDB ;OPEN BOOT.DAT FILE BCC 2$ ;OK CONTINUE MOV #CB2,R0 ;GET MESSAGE CONTROL BLOCK JMP ERROR ;OPEN ERROR(BOOT.DAT) 2$: JSR PC,RDBLK ;READ BLOCK NUMBER ONE DEC RECOFF ;INDICATE ACTUAL NUMBER OF RECORDS MOV #BUF,R0 ;POINT TO BOOT.DAT STARTING RECORD MOV #RBUF+XSRC,R1 ;POINT TO REMOTE NODE ADDRESS 4$: CMP (R0),(R1) ;FIRST WORD MATCH ? BNE 5$ ;NO CMP 2(R0),2(R1) ;SECOND WORD MATCH ? BNE 5$ ;NO CMP 4(R0),4(R1) ;THIRD WORD MATCH ? BEQ 6$ ;YES 5$: ADD #RECSZ,R0 ;POINT TO NEXT RECORD DEC RECOFF ;DECREMENT RECORD COUNT BGT 4$ ;TRY AGAIN MOV #CB3,R0 ;GET MESSAGE CONTROL BLOCK JMP ERROR ;ILLEGAL NODE ADDRESS 6$: ADD #FOFF,R0 ;ADD IN FILE NAME OFFSET MOV #FNAM,R1 ;GET DSPT FILE NAME ADDRESS MOV #FNAMSZ,R2 ;GET FILE NAME SIZE CLR FNAMX ;CLEAR FILE NAME LENGTH FIELD 7$: MOVB (R0)+,(R1) ;XFR FILE NAME STRING CMPB #40,(R1)+ ;IS IT A TRAILING SPACE ? BEQ 8$ ;YES END OF NAME INC FNAMX ;BUMP FILE NAME LENGTH SOB R2,7$ ;XFR NEXT BYTE 8$: MOV RBUF+XNBLK,SNBLK ;SAVE NUMBER OF BLOCKS MOV RBUF+4,WBUF+XSRC+4 ;GET MY NODE ADDRESS MOV RBUF+XSRC,WBUF ;GET REMOTE NODE ADDRESS(1) MOV RBUF+XSRC+2,WBUF+2 ;GET REMOTE NODE ADDRESS(2) MOV RBUF+XSRC+4,WBUF+4 ;GET REMOTE NODE ADDRESS(3) MOV RBUF+XTYP,WBUF+XTYP ;GET LOAD TYPE CODE CLR WBUF+XFLG ;CLEAR FLAG WORD MOV RBUF+XTSK,WBUF+XTSK ;GET MY TASK NAME(1) MOV RBUF+XTSK+2,WBUF+XTSK+2 ;GET MY TASK NAME(2) MOV #1,NREC+2 JSR PC,CLOSE ;CLOSE BOOT.DAT DATA FILE MOV #CB4,R0 ;GET MESSAGE CONTROL BLOCK JSR PC,TYPE ;TYPE LOAD REQUEST OPEN$R #FDB ;OPEN LOAD FILE FOR READ BCC 9$ ;OK SKIP ERROR EXIT MOV #CB5,R0 ;GET MESSAGE CONTROL BLOCK JMP ERROR ;LOAD FILE OPEN ERROR 9$: JSR PC,RDBLK ;READ LABEL-0 BLOCK MOV BUF+L$BXFR,SADR ;SAVE SYSTEM XFR ADDRESS MOV BUF+L$BBLK,NREC+2 ;NUMBER OF LABEL BLOCKS INC NREC+2 ;POINT TO STARTING BLOCK NUMBER 10$: JSR PC,RDNBLK ;READ N PROGRAM BLOCKS(FROM DISK) BCS 30$ ;END OF FILE MOV #NBUF,R5 ;GET BUFFER COUNT MOV #WBUF,R4 ;GET HEADER ADDRESS 15$: JSR PC,SNDPKT ;SEND PROGRAM LOAD BLOCK CMP IOSB1+2,#BUFSZ ;LAST BUFFER ? BLE 20$ ;YES SKIP HEADER XFR MOV #WBUF,R0 ;GET ORIGINAL HEADER ADDRESS MOV #HDRSZ/2,R1 ;GET HEADER LENGTH IN WORDS ADD #BUFSZ,R4 ;GET NEXT HEADER ADDRESS MOV R4,R2 ;USE R2 FOR HEADER XFR 18$: MOV (R0)+,(R2)+ ;XFR HEADER SOB R1,18$ ;LOOP ON HEADER SIZE 20$: JSR PC,RDPKT ;RECEIVE NEXT REQUEST TST RBUF+XNBLK ;ERROR IF NON-ZERO BEQ 25$ ;NO CONTINUE MOV #CB8,R0 ;REMOTE CRC ERROR ??? JMP ERROR ;TYPE ERROR MESSAGE 25$: DEC SNBLK ;LAST BLOCK ? BLE 30$ ;EXIT ON BLOCK COUNT SUB #BUFSZ,IOSB1+2 ;REMAINING BYTE COUNT BMI 30$ ;END OF FILE SOB R5,15$ ;SEND NEXT BUFFER ? BR 10$ ;NO READ NEW DISK BUFFER 30$: JSR PC,SNDADR ;SEND SYSTEM START ADDRESS JSR PC,CLOSE ;CLOSE FILE MOV #CB7,R0 ;GET MESSAGE CONTROL BLOCK JSR PC,TYPE ;TYPE LOAD COMPLETE EXIT: EXIT$S ;PROGRAM EXIT ; ;READ ETHERNET PACKET ; RDPKT: DIR$ #RDPB ;READ AND WAIT TST IOSB2 ;PACKET HERE YET ? BNE 10$ ;YES SKIP TIME OUT DIR$ #TMO ;SET TIME OUT WTLO$S 0,#RDMSK ;WAIT FOR PKT OR TMO TST IOSB2 ;PACKET HERE ? BNE 5$ ;YES CONTINUE MOV #CB6,R0 ;GET MESSAGE CONTROL BLOCK JMP ERROR ;TIME OUT ERROR EXIT 5$: CMKT$S #MKTEF ;CANCEL TIME OUT(EF=14.) 10$: RTS PC ; ;SEND PROGRAM BLOCK/STARTING ADDRESS ; SNDADR: MOV SADR,WBUF+XFLG ;GET STARTING ADDRESS MOV #RPWC,R1 ;GET WORD COUNT MOV #WBUF,R4 ;GET ORIGINAL HEADER ADDRESS BR SS1 SNDPKT: MOV #SBWC,R1 ;SEND BLOCK WORD COUNT SS1: ASL R1 MOV R1,WDPB+Q.IOPL+2 ;FILL IN PACKET SIZE MOV R4,WDPB+Q.IOPL ;FILL IN BUFFER ADDRESS DIR$ #WDPB ;SEND PACKET RTS PC ; ;READ DISK BLOCK ; RDBLK: MOV #BUFSZ,R1 ;READ ONE BLOCK BR RDBN RDNBLK: MOV #NBUF*BUFSZ,R1 ;READ N BLOCKS RDBN: READ$ #FDB,,R1,#NREC BCS 10$ ;END OF FILE WAIT$ R0 ;WAIT FOR READ COMPLETION ASH #-9.,R1 ;GET RECORD COUNT ADD R1,NREC+2 ;UPDATE RECORD NUMBER CLC 10$: RTS PC ; ;CLOSE FILE ; CLOSE: CLOSE$ #FDB RTS PC ; ;TYPE EMESSAGE ROUTINE ; ; R0=MESSAGE CONTROL BLOCK ADDRESS ; TYPE: MOV (R0),TTDPB+Q.IOPL ;STORE MESSAGE ADDRESS MOV 2(R0),TTDPB+Q.IOPL+2 ;STORE MESSAGE LENGTH TST 4(R0) ;ANY VARIABLE DATA ? BEQ 10$ ;NO MOV FNAMX,R2 ;GET LENGTH OF VARIABLE STRING ADD R2,TTDPB+Q.IOPL+2 ;ADD TO MESSAGE LENGTH MOV 4(R0),R1 ;GET VARIABLE STRING ADDRESS MOV #FNAM,R0 ;GET FILE NAME ADDRESS 5$: MOVB (R0)+,(R1)+ ;TRANSFER VARIABLE STRING SOB R2,5$ ;LOOP ON BYTE COUNT 10$: DIR$ #TTDPB ;TYPE MESSAGE RTS PC ; ;GENERAL ERROR ROUTINE ; ERROR: JSR PC,TYPE ;TYPE ERROR MESSAGE JSR PC,CLOSE ;TRY TO CLOSE ANY OPEN FILES DIR$ #KILL ;KILL ETHERNET READ QIO JMP EXIT ; ;RECEIVE DATA AST ENTRY ; RECAST: SETF$S #RECEF ;SET RECEIVE AST EVENT FLAG ASTX$S ;EXIT AST STATE ; SNBLK: .BLKW 1 ;SAVE NUMBER OF BLOCKS SADR: .BLKW 1 ;STARTING ADDRESS NREC: .WORD 0,1 ;VIRTUAL BLOCK NUMBER IOSB1: .BLKW 2 ;DISK READ STATUS BLOCK IOSB2: .BLKW 2 ;ETHERNET RECEIVE STATUS BLOCK IOSB3: .BLKW 2 ;ETHERNET XMIT STATUS BLOCK RDPB: QIO$ IO.RLB,L2,EF2,,IOSB2,, WDPB: QIOW$ IO.WLB,L2,EF3,,IOSB3,,<0,0> SDAT: SDAT$ LWT...,RECBUF RCVD: RCVD$ LWT...,RECBUF TMO: MRKT$ MKTEF,12,2 ;EF=14.,DT=TEN SECONDS TTDPB: QIOW$ IO.WLB,L3,EF4,,,,<0,0,40> KILL: QIOW$ IO.KIL,L2 ; ;MESSAGE CONTROL BLOCKS ; CB1: .WORD MS1,MS1L,0 CB2: .WORD MS2,MS2L,0 CB3: .WORD MS3,MS3L,0 CB4: .WORD MS4,MS4L,MS4X CB5: .WORD MS5,MS5L,MS5X CB6: .WORD MS6,MS6L,MS6X CB7: .WORD MS7,MS7L,MS7X CB8: .WORD MS8,MS8L,0 FSRSZ$ 0 ;INITIALIZE FSR FDB: FDBDF$ ;ALLOCATE FDB FDRC$A FD.RWM FDBK$A BUF,1000,,EF1,IOSB1 FDOP$A L1,DSPT DSPT: .WORD FDEVL,FDEV .WORD FUICL,FUIC FNAMX: .WORD FNAML,FNAM FDEV: .ASCII /SY0:/ FDEVL=.-FDEV FUIC: .ASCII /[300,64]/ FUICL=.-FUIC FNAM: .ASCII /BOOT.DAT;1/ FNAML=.-FNAM .BLKB FNAMSZ-FNAML ;ALLOW SPACE FOR 17. BYTES MS1: .ASCII /DLT--CONNECT REQUEST TIME OUT/ MS1L=.-MS1 MS2: .ASCII /DLT--OPEN ERROR ON BOOT.DAT/ MS2L=.-MS2 MS3: .ASCII /DLT--UNKNOWN NODE ADDRESS/ MS3L=.-MS3 MS4: .ASCII /DLT--DOWN LINE LOAD REQUEST--/ MS4L=.-MS4 MS4X: .BLKB FNAMSZ ;VARIABLE STORAGE AREA MS5: .ASCII /DLT--OPEN ERROR ON LOAD FILE--/ MS5L=.-MS5 MS5X: .BLKB FNAMSZ MS6: .ASCII /DLT--DOWN LINE LOAD TIME OUT--/ MS6L=.-MS6 MS6X: .BLKB FNAMSZ MS7: .ASCII /DLT--DOWN LINE LOAD COMPLETE--/ MS7L=.-MS7 MS7X: .BLKB FNAMSZ MS8: .ASCII /DLT--CRC ERROR/ MS8L=.-MS8 .EVEN XQCON: .WORD XQCONR ;PUT XQ: CONNECT TYPE CODE IN MESSAGE .=XQCON RECBUF: .BLKW 42 ;RECEIVE DATA/PACKET BUFFER RBUF=RECBUF+4 ;RECEIVE PACKET BUFFER WBUF: .BLKW BUFSZ*NBUF+HDRSZ/2 ;SEND PACKET BUFFER BUF=WBUF+HDRSZ ;READ DISK BLOCK BUFFER .END START