;QNA PRIMARY DOWN LINE LOADER (BOOTQNA.MAC) ; ;THIS CODE IS INTENDED TO BE EPROM BASED ; ; ; 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 BOOTQNA .IDENT /1C/ ; XQSTN=174440 ;QNA STATION ADDRESS RBDL=XQSTN+4 ;QNA RECEIVE BDL ADDRESS REGISTER XBDL=XQSTN+10 ;QNA TRANSMIT BDL ADDRESS REGISTER XQCSR=XQSTN+16 ;QNA CSR ADDRESS PAR7=177600 ;I/O PAGE PAR7 VALUE PDR=77406 ;PAGE DESCRIPTOR REGISTER VALUE KPAR0=172340 ;KERNEL PAR0 ADDRESS KPDR0=172300 ;KERNEL PDR0 ADDRESS KPAR1=172342 ;KERNEL PAR1 ADDRESS MMSR0=177572 ;MEMORY MANAGEMENT STATUS - 0 MMSR3=172516 ;MEMORY MANAGEMENT STATUS - 3 IBDL=100000 ;BDL INITIAL VALUE (FLAG,STATUS-1,2) RDERR=40000 ;READ ERROR MASK BIT RUNT=4000 ;RUNT RECEIVE ERROR BLKSZ=400 ;WORKING BLOCK SIZE IN WORDS BDLSZ=14 ;BDL SIZE IN BYTES SWC=100 ;SETUP WORD COUNT RWC=40 ;REQUEST WORD COUNT TERMSZ=4 ;TERMINATOR SIZE IN BYTES STACK=700 ;STACK INITIAL VALUE TRAP=4 ;NONEXISTANT MEMORY TRAP VECTOR BLKOFF=100 ;OFFSET INTO LAST BLOCK BASE=20000+BLKOFF ;WORK AREA BASE ADDRESS(FOR PAR1) BDLADR=BASE ;BDL 22 BIT BASE ADDRESS(REC/XMIT) XBD=BDLADR+10 ;XMIT BUFFER DESCRIPTOR RBD=XBD+BDLSZ+TERMSZ ;RECEIVE BUFFER DESCRIPTOR RBD1=RBD ;FIRST READ BUFFER DESCRIPTOR RBD2=RBD1+BDLSZ ;SECOND READ BUFFER DESCRIPTOR XBUF=RBD2+BDLSZ+TERMSZ ;XMIT BUFFER ADDRESS RBUF=SWC*2+XBUF ;RECEIVE BUFFER ADDRESS XBLK=16 ;OFFSET TO MEMORY SIZE SADR=XBLK ;TRANSFER ADDRESS RD1WC=12 ;RBDL1 WORD COUNT RD2WC=400 ;RBDL2 WORD COUNT LDTYP=3 ;LOAD TYPE CODE LDNOD=1 ;LOAD NODE ADDRESS BOOTADR=173000 ;BOOT STARTING ADDRESS ;DEBUG=0 ;INCLUDE DEBUG CODE ; ; .PAGE .SBTTL DOWN LINE REQUEST FORMAT ; ;DOWN LINE LOAD REQUEST PACKET FORMAT(TO DLT) ; ; PACKET FORMAT FIELD SIZE ; ; ___________ ; ! ! ; ! 0 ! ; ! ! ; !-----------! ; ! ! ; ! 0 ! 6 ; ! ! ; !-----------! ; ! ! ; ! LNOD ! ; ! ! ; !-----------! ; ! ! ; ! STATION ! 6 ; ! ADDRESS ! ; ! ! ; !-----------! ; ! ! ; ! LDTYP ! 2 ; ! ! ; !-----------! ; ! ! ; ! NBLK/0 ! 2 ; ! ! ; !-----------! ; ! ! ; ! LOADER ! ; ! TASK NAME ! 4 ; ! ! ; !-----------! ; ! ! ; ! NOT USED ! 44(10) ; ! ! ; !___________! ; .PAGE .SBTTL DOWN LINE LOAD REPLY FORMAT ; ;DOWN LINE LOAD REPLY FORMAT (FROM DLT) ; ; PACKET FORMAT FIELD SIZE ; ; ___________ ; ! ! ; ! STATION ! ; ! ADDRESS ! 6 ; ! ! ; !-----------! ; ! ! ; ! 0 ! ; ! ! ; !-----------! ; ! ! ; ! 0 ! 6 ; ! ! ; !-----------! ; ! ! ; ! LDNOD ! ; ! ! ; !-----------! ; ! ! ; ! LDTYP ! 2 ; ! ! ; !-----------! ; ! ! ; ! FLAG/SADR ! 2 ; ! ! ; !-----------! ; ! ! ; ! LOADER ! ; ! TASKNAME ! 4 ; ! ! ; !-----------! ; ! ! ; ! DATA ! ; ! BLOCK ! 512(10) ; ! ! ; !___________! ; .PAGE .SBTTL LAST MEMORY BLOCK FORMAT ; ;LAST MEMORY BLOCK FORMAT(512 BYTES) ; ; PACKET FORMAT FIELD SIZE(8) OFFSET ; ; ___________ ; ! ! ; ! RBUF1 ! 24 RBUF ; ! ! ; !-----------! ; ! ! ; ! XBUF ! 200 XBUF ; ! ! ; !-----------! ; ! ! ; ! TERM ! 4 ; ! ! ; !-----------! ; ! ! ; ! RBD2 ! 14 RBD2 ; ! ! ; !-----------! ; ! ! ; ! RBD1 ! 14 RBD/RDB1 ; ! ! ; !-----------! ; ! ! ; ! TERM ! 4 ; ! ! ; !-----------! ; ! ! ; ! XBD ! 14 XBD ; ! ! ; !-----------! ; ! ! ; ! XBDL ADR ! 4 ; ! ! ; !-----------! ; ! ! ; ! RBDL ADR ! 4 BASE/BDLADR ; ! ! ; !-----------! ; ! ! ; ! NOT USED ! 100 ; ! ! ; !___________! ; .PAGE .SBTTL STARTUP SIZE MEMORY .PSECT BOOT ; ; ;SIZE MEMORY(R5=NUMBER OF 512 BYTE BLOCKS) ; TRPADR=BOOTADR+INIT-START ;OFFSET TO TRAP RETURN ; START:: MOV #STACK,SP ;SETUP STACK MTPS #340 ;LOCKOUT INTERRUPTS(LTC) RESET ;RESET SYSTEM MOV #TRPADR,@#TRAP ;*** SET UP TRAP VECTOR *** MOV #341,@#TRAP+2 ;SET UP PROCESSOR STATUS MOV #KPAR0,R0 ;PAR0 ADDRESS MOV #KPDR0,R1 ;PDR0 ADDRESS MOV #10,R2 ;EIGHT REGISTER PAIRS CLR R3 ;START WITH PAR0 3$: MOV R3,(R0)+ ;SET UP PAR(X) MOV #PDR,(R1)+ ;SET UP PDR(X) ADD #200,R3 ;NEXT PAGE SOB R2,3$ MOV #PAR7,-2(R0) ;MAP TO I/O PAGE INC @#MMSR0 ;ENABLE MEMORY MANAGEMENT MOV #200,R5 ;START WITH ADDRESS(20000) MOV #BASE,R4 ;GET PAR1 VALUE MOV #-1,R0 ;GET DATA WORD ALL ONE'S 5$: TST (R4) ;MEMORY BLOCK PRESENT ? MOV R4,R1 ;GET BLOCK BASE ADDRESS BIC #777,R1 ;SET TO MODULO 1000 BOUNDRY MOV #BLKSZ,R2 ;GET BLOCK SIZE IN WORDS 11$: MOV R0,(R1) ;WRITE 177777 TO LOCATION CMP R0,(R1) ;MEMORY DATA WORD OK ? BNE 12$ ;NO MEMORY ERROR CLR (R1)+ ;WRITE ZERO TO LOCATION BNE 12$ ;NO MEMORY ERROR SOB R2,11$ ;CHECK NEXT WORD ADD #10,R5 ;NEXT BLOCK MOV R5,@#KPAR1 ;UPDATE PAR1 BR 5$ 12$: HALT ;MEMORY ERROR HALT BR 12$ ;DON'T CONTINUE ; .PAGE .SBTTL INITIALIZE QNA ; ;INITIALIZE QNA ; INIT: SUB #10,R5 ;BACKUP ONE BLOCK MOV R5,@#KPAR1 ;POINT TO LAST BLOCK IN MEMORY ASH #-3,R5 ;NUMBER OF BLOCKS TO SEND MOV #BASE+STACK,SP ;MOVE STACK TO LAST MEMORY BLOCK TST -(SP) ;RESERVE STACK FOR STATION BYTE MOV #XBUF+1-BASE,R1 ;XMIT SETUP BUFFER ADD R4,R1 ;BASE ADDRESS MOV #XQSTN,R0 ;STATUS ADDRESS MOV #6,R2 ;ADDRESS BYTE COUNT 20$: MOV (R0)+,(SP) ;GET STN ADDRESS BYTE MOV #7,R3 ;BLOCK ADDRESS FIELD SIZE 21$: MOVB (SP),(R1)+ ;MOVE IT TO SETUP BUFFER(1-7) MOVB (SP),77(R1) ;MOVE IT TO SETUP BUFFER(8-14) SOB R3,21$ ;LOOP ON ADDRESS FIELD SIZE TSTB (R1)+ ;SKIP COLUMN ZERO SETUP ADDRESS SOB R2,20$ ;LOOP ON STATION ADDRESS COUNT TST (SP)+ ;CLEANUP STACK MOV R5,R1 ;GET NUMBER OF BLOCKS(512 BYTES) CLR R0 ;CLEAR HIGH ORDER PART ASHC #11,R0 ;GET BASE ADDRESS FOR LAST BLOCK ADD #BLKOFF,R1 ;ADD IN OFFSET INTO LAST BLOCK MOV R4,R2 ;GET BDL 22 BIT ADDRESS POINTER MOV R1,(R2) ;BUILD RBDL1 22 BIT ADDRESS ADD #RBD1-BASE,(R2)+ ;ADD OFFSET TO LO-ORDER PART MOV R0,(R2)+ ;STORE HI-ORDER PART MOV R1,(R2) ;BUILD XBDL 22 BIT ADDRESS ADD #XBD-BASE,(R2)+ ;ADD OFFSET TO LO-ORDER PART MOV R0,(R2)+ ;STORE HI-ORDER PART ADD #XBUF-BASE,R1 ;22 BIT ADDRESS FOR XMIT BUFFER MOV R0,XBD+2-BASE(R4) ;STORE HIGH ORDER PART(BITS 16-21) MOV R1,XBD+4-BASE(R4) ;STORE LOW ORDER PART(BITS 0-15) ADD #RBUF-XBUF,R1 ;22 BIT ADDRESS FOR REC. BUFFER #1 MOV R0,RBD1+2-BASE(R4) ;STORE HIGH ORDER PART(BITS 16-21) MOV R1,RBD1+4-BASE(R4) ;STORE LOW ORDER PART(BITS 0-15) MOV #130000,R0 ;SETUP BD BITS MOV #-SWC,R1 ;SETUP WORD COUNT JSR PC,SNDREQ ;INITIALIZE QNA .PAGE .SBTTL SETUP REQUEST BUFFER ; ;SETUP REQUEST BUFFER ; 25$: MOV R4,R0 ;GET WORK AREA BASE ADDRESS ADD #XBUF-BASE,R0 ;GET XMIT BUFFER ADDRESS CLR (R0)+ ;DESTINATION FIELD(1) CLR (R0)+ ;DESTINATION FIELD(2) MOV #LDNOD,(R0)+ ;LOAD NODE ADDRESS MOV #XQSTN,R1 ;STATION ADDRESS REGISTER MOV #6,R2 ;STATION FIELD SIZE 26$: MOV (R1)+,R3 ;GET STATION ADDRESS BYTE MOVB R3,(R0)+ ;PUT IT IN BUFFER SOB R2,26$ MOV #LDTYP,(R0)+ ;DOWN LINE LOAD TYPE CODE MOV R5,(R0)+ ;MEMORY SIZE IN BLOCKS MOV LTASK,(R0)+ ;LINE WATCHER TASK NAME(1) MOV LTASK+2,(R0)+ ;LINE WATCHER TASK NAME(2) MOV #401,@#XQCSR ;ENABLE QNA(REC,DISABLE INT. LOOP BACK) .PAGE .SBTTL LOAD SYSTEM ; ;LOAD SYSTEM ; 30$: MOV #120000,R0 ;XMIT BD BITS MOV #-RWC,R1 ;REQUEST WORD COUNT JSR PC,SNDREQ ;REQUEST NEXT BLOCK BCC 31$ ;OK CONTINUE HALT ;TIME OUT HALT JMP START ;ERROR START OVER 31$: CLR XBUF+XBLK-BASE(R4) ;RESET BLOCK ADDRESS MOV RBUF+20-BASE(R4),XBUF+20-BASE(R4) ;GET REAL DLT TASK NAME(1) MOV RBUF+22-BASE(R4),XBUF+22-BASE(R4) ;GET REAL DLT TASK NAME(2) ADD #1000,-10(R3) ;UPDATE ADR-LO ADC -12(R3) ;UPDATE ADR-HI MOV RBUF+SADR-BASE(R4),R0 ;GET FLAG/SYSTEM START ADDRESS BEQ 30$ ;REQUEST NEXT BLOCK MOV #200,@#KPAR1 ;RESET PAR1 JMP (R0) ;STARTUP SYSTEM .PAGE .SBTTL SEND/RECEIVE PACKETS ; ;SEND REQUEST WAIT FOR REPLY ; SNDREQ: MOV R4,R3 ;GET BASE ADDRESS ADD #XBD-BASE,R3 ;XMIT BUFFER DESC. JSR PC,MAKBD ;MAKE XMIT BD CMP (R3)+,(R3)+ ;SKIP XMIT TERMINATOR MOV R2,R0 ;GET READ DESC(IBDL) MOV #-RD1WC,R1 ;READ BUFFER #1 LENGTH(WORDS) JSR PC,MAKBD ;MAKE RECIEVE-1 BD MOV #-RD2WC,R1 ;READ BUFFER #2 LENGTH(WORDS) JSR PC,MAKBD ;MAKE RECIEVE-2 BD MOV #RBDL,R0 ;GET RECEIVE BDL START ADDRESS MOV R4,R1 ;BDL 22 BIT ADDRESS TABLE MOV (R1)+,(R0)+ ;RECEIVE BDL START ADDRESS-LO MOV (R1)+,(R0)+ ;START RECEIVE BIT #RDERR,XBUF+XBLK-BASE(R4) ;READ ERROR ? BEQ 1$ ;NO XMIT NEW REQUEST BIT #RUNT,XBUF+XBLK-BASE(R4) ;WAS READ ERROR A RUNT ? BNE 2$ ;YES RE-POST REC. BUFFER ONLY 1$: MOV (R1)+,(R0)+ ;XMIT BDL START ADDRESS-LO MOV (R1)+,(R0)+ ;START XMIT 2$: MOV #20,R1 ;GET OUTER LOOP COUNT 3$: CLR R0 ;INTER LOOP COUNT 5$: BIT R2,-4(R3) ;REQUEST COMPLETE ? BEQ 7$ ;DONE CHECK FOR ERRORS SOB R0,5$ ;TIME OUT INTER LOOP SOB R1,3$ ;TIME OUT OUTER LOOP BR 8$ ;TIME OUT ERROR 7$: CLC ;ASSUME SUCCESS BIT #RDERR,-4(R3) ;RECEIVE ERROR ? BEQ 10$ ;NO EXIT MOV -4(R3),XBUF+XBLK-BASE(R4) ;SAVE ST1 ERROR BITS FOR DLT BR SNDREQ ;RE-POST BUFFER 8$: SEC ;INDICATE TIMEOUT/READ ERROR 10$: RTS PC ; ;MAKE BUFFER DESCRIPTOR ; MAKBD: MOV #IBDL,R2 MOV R2,(R3)+ ;INIT FLAG WORD BIC #130000,(R3) ;CLEAR OUT DESCRIPTOR BITS BIS R0,(R3)+ ;INIT DESC WORD TST (R3)+ ;SKIP BUFFER ADDRESS MOV R1,(R3)+ ;WORD COUNT MOV R2,(R3)+ ;INIT STATUS-1 MOV R2,(R3)+ ;INIT STATUS-2 RTS PC LTASK: .RAD50 /LWT.../ .=START+776 ID: .ASCII /1C/ ;EPROM VERSION NUMBER(ADR=173776) END: .END