; FALCON QNA DOWN LINE LOADER/ODT(FALODT.MAC) ; ; PAUL ELKINS 22-NOV-84 ; ; LOS ALAMOS NATIONAL LAB. ; PO BOX 1663 MS-J957 ; LOS ALAMOS NM 87545 ; 505 667 3502 ; ; .TITLE FALODT ; .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 TKS=177560 ;CONSOLE KEYBOARD STATUS REGISTER TKB=TKS+2 ;CONSOLE KEYBOARD DATA BUFFER TPS=TKS+4 ;CONSOLE OUTPUT STATUS REGISTER TPB=TKS+6 ;CONSOLE OUTPUT DATA BUFFER LFX=12 ;LINE FEED CHARACTER CRX=15 ;CARRIAGE RETURN CHARACTER IBDL=100000 ;BDL INITIAL VALUE (FLAG,STATUS-1,2) RDERR=40000 ;READ ERROR MASK BIT RUNT=4000 ;RUNT READ ERROR BLKSZ=340 ;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 STKSZ=200 ;ODT STACK SIZE IN BYTES STACK=170000 ;SYSTEM STACK INITIAL VALUE STATUS=STACK-2 ;SYSTEM STATUS WORD MEMTOP=STACK-4 ;TOP OF LOADABLE MEMORY(START OF WORK AREA) MEMSZ=STACK-6 ;MEMORY SIZE IN 512 BYTE BLOCKS SAVPS=STACK-10 ;SAVE PROCESSOR STATUS WORD SAVPC=STACK-12 ;SAVE PROGRAM COUNTER SAVSP=STACK-14 ;SAVE STACK POINTER SAVR5=STACK-16 ;SAVE R5 SAVR4=STACK-20 ;SAVE R4 SAVR3=STACK-22 ;SAVE R3 SAVR2=STACK-24 ;SAVE R2 SAVR1=STACK-26 ;SAVE R1 SAVR0=STACK-30 ;SAVE R0 SIZMEM=1 ;SIZE MEMORY STATUS BIT USER=2 ;USER MODE STATUS BIT DBFLT=4 ;DOUBLE BUS FAULT EXEC=10 ;LOAD SYSTEM AND EXECUTE IF TRUE BRK=20 ;BREAK INTERRUPT REQUEST STKOK=40 ;STACK OK STATUS BIT HLT=100 ;HALT STATUS BIT BASE=0 ;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 DBUG=0 ;INCLUDE DEBUG CODE IF DEFINED ; .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 BREAK INTERRUPT/POWERUP/SIZE MEMORY .PSECT BOOT ; ; ;BREAK INTERRUPT ENTRY ; BREAK:: BR ID+2 ;SKIP ID CODE ; ID:: .ASCII /1C/ ;EPROM ID CODE ; BIT #USER,STATUS ;IN USER MODE ? BEQ LTC ;NO IGNORE BREAK(FROM ODT) BIS #BRK,STATUS ;SET BREAK STATUS INDICATOR BR RSTRT ;GO TO RESTART/ODT ; LTC:: RTI ;IGNORE RTC INTERRUPT ; ;POWERUP SIZE MEMORY(R5=NUMBER OF 512 BYTE BLOCKS) ; PWRUP:: MOV #SAVR0,SP ;SETUP STACK MTPS #340 ;SET PS TO PR7 RESET ;RESET SYSTEM MOVB #32,@#TPS ;SET 11/21 BAUD RATE=2400 BPS MOVB #'?,@#TPB ;TYPE "?" ON CONSOLE MOV #STACK-STKSZ,R0 ;STACK BASE ADDRESS MOV #STKSZ/2,R1 ;STACK SIZE IN WORDS 2$: CLR (R0)+ ;CLEAR STACK AREA SOB R1,2$ ;LOOP ON STACK SIZE MOV #SIZMEM,STATUS ;SETUP STATUS WORD CLR R4 ;START WITH LOCATION ZERO 5$: MOV R4,(R4) ;STORE MEMORY CELL ADDRESS IN ITSELF NOP ;FALCON WILL INTERRUPT HERE TST (R4)+ ;ADVANCE TO NEXT CELL BR 5$ ;TRY NEXT LOCATION .PAGE .SBTTL SYSTEM RESTART ENTRY ; ;SYSTEM RESTART ENTRY ; RSTRT:: .IFDF DBUG JMP DEBUG ;***************** DBRTN: ;****************** .ENDC BIT #SIZMEM,STATUS ;SIZE MEMORY IN PROGRESS ? BNE TMEM ;CONTINUE MEMORY TEST BIT #USER,STATUS ;USER MODE ? BNE 1$ ;YES CONTINUE JMP ERR4 ;NON-EXISTANT MEMORY ; ;CHECK FOR DOUBLE BUS FAULT AND SAVE USER REGISTERS ; 1$: BIT #DBFLT,STATUS ;DOUBLE BUS FAULT ? BNE 10$ ;YES SKIP USER STACK ACCESS BIS #DBFLT,STATUS ;SET FOR POSSIBLE DOUBLE BUS FAULT CMP (SP),#RSTRX ;PC = RESTART ADDRESS ? NOP ;FALCON MAY INTERRUPT HERE BNE 5$ ;NO CMP (SP)+,(SP)+ ;YES GET REAL PC(STACK POINTER) NOP ;FALCON MAY INTERRUPT HERE 5$: MOV SP,SAVSP ;SAVE USER STACK POINTER MOV (SP)+,SAVPC ;GET PC FROM USER STACK NOP ;FALCON MAY INTERRUPT HERE MOV (SP),SAVPS ;GET PS FROM USER STACK NOP ;FALCON MAY INTERRUPT HERE BIC #DBFLT,STATUS ;CLEAR DOUBLE BUS FAULT INDICATOR BIS #STKOK,STATUS ;INDICATE STACK OK STATUS 10$: MOV #SAVSP,SP ;SETUP STACK POINTER TO SAVE R5 MOV R5,-(SP) ;SAVE R5 MOV R4,-(SP) ;SAVE R4 MOV R3,-(SP) ;SAVE R3 MOV R2,-(SP) ;SAVE R2 MOV R1,-(SP) ;SAVE R1 MOV R0,-(SP) ;SAVE R0 BIC #DBFLT,STATUS ;CLEAR DBFLT STATUS BIT BIT #BRK,STATUS ;DID BREAK GET US HERE ? BNE ODT ;YES GOT TO ODT BIT #STKOK,STATUS ;DID STACK ERROR GET US HERE ? BNE 15$ ;NO STACK OK(MUST BE NXM) JMP ERR3 ;TYPE BAD STACK MESSAGE 15$: JMP ERR4 ;TYPE NXM/DEVICE TIME OUT MESSAGE ; ;TEST MEMORY ; TMEM: BIC #SIZMEM,STATUS ;CLEAR SIZE MEMORY STATUS BIT TST R4 ;LO-MEMORY PRESENT ? BEQ 6$ ;NO LO-MEMORY SKIP TEST SUB #2,R4 ;BACKUP ONE WORD CLR R3 ;START WITH ADDRESS ZERO 3$: CMP R3,(R3) ;COMPLETE MEMORY ADDRESS CHECK BEQ .+6 ;TEST SUCCESSFUL CONTINUE JMP ERR1 ;MEMORY ADDRESS ERROR TST (R3)+ ;ADVANCE TO NEXT MEMORY ADDRESS CMP R3,R4 ;END OF MEMORY ? BLOS 3$ ;NO IF .LE. MOV #-1,R2 ;INITIAL DATA WORD CLR R3 ;START WITH ADDRESS ZERO 5$: MOV R2,(R3) ;WRITE MEMORY CELL(ALL ONE'S) CMP R2,(R3) ;DATA EQUAL 177777 ? BEQ .+6 ;TEST SUCCESSFUL CONTINUE JMP ERR1 ;NO MEMORY DATA ERROR COM (R3)+ ;CLEAR MEMORY CELL BEQ .+6 ;TEST SUCCESSFUL CONTINUE JMP ERR1 ;MEMORY DATA ERROR CMP R3,R4 ;END OF MEMORY ? BLOS 5$ ;NO IF .LE. SUB #BLKSZ*2-2,R4 ;GET WORK AREA BASE ADDRESS 6$: MOV R4,R5 ;LAST MEMORY BLOCK ADDRESS MOV #11,R3 ;SHIFT COUNT 7$: CLC ;GET BLOCK COUNT(MODULO 1000) ROR R5 ;SHIFT RIGHT ONE PLACE SOB R3,7$ MOV R4,MEMTOP ;TOP OF LOADABLE MEMORY MOV R5,MEMSZ ;SAVE MEMORY SIZE(512 BYTE BLOCKS) BGT 10$ ;LO-MEMORY PRESENT(MUST BE POSITIVE) ? JMP ERR5 ;NO TYPE NO MEMORY MESSAGE 10$: MOV #LTC,@#100 ;SETUP LTC VECTOR ADDRESS MOV #340,@#102 ;SETUP LTC PS WORD MOV #BREAK,@#140 ;SETUP BREAK VECTOR ADDRESS MOV #340,@#142 ;SETUP RESTART PS WORD .PAGE .SBTTL CONSOLE ODT ; ;CONSOLE ODT ; ODT:: MOV #SAVR0,SP ;SETUP ODT STACK JSR PC,CRLF ;OUTPUT A CARRIAGE RETURN/LF BIT #USER,STATUS ;ENTRY FROM USER MODE ? BEQ 5$ ;NO SKIP PC TYPE OUT MOV SAVPC,R0 ;GET PC VALUE JSR PC,PUTNUM ;TYPE IT OUT BIC #USER,STATUS ;CLEAR USER MODE 5$: MTPS #300 ;ALLOW BREAK INTERRUPT'S TYPAT: JSR PC,CRLF ;TYPE CARRIAGE RETURN/LINE FEED MOVB #'@,R2 ;GET "@" JSR PC,PCHAR ;TYPE "@" JSR PC,GETNUM ;WAIT FOR INPUT CMPB #'G,R2 ;GO ? BNE 10$ ;NO CLR SAVPS ;ZERO PROCESSOR STATUS MOV R0,SAVPC ;SETUP PC FOR GO COMMAND JMP RSRG ;EXECUTE GO COMMAND 10$: CMPB #'P,R2 ;PROCEED ? BNE 15$ ;NO JMP RSRG ;RESTORE REGISTERS 15$: CMPB #'L,R2 ;LOAD COMMAND ? BNE 16$ ;NO TRY "F" BIS #EXEC,STATUS ;SET TO LOAD AND EXECUTE JMP LOAD ;GO LOAD SYSTEM 16$: CMPB #'F,R2 ;FETCH COMMAND(DON'T EXECUTE) ? BNE 17$ ;NO TRY "R" BIC #EXEC,STATUS ;SET TO NO EXECUTE JMP LOAD ;GO FETCH SYSTEM 17$: CMPB #'R,R2 ;RS/RX ? BNE 30$ ;NO TRY TYPE MEMORY JSR PC,GETNUM ;GET NEXT CHARACTER BNE 20$ ;NUMERIC INPUT (TYPE REGISTER) CMPB #'S,R2 ;MUST BE AN "S" BNE TYPQES ;NO ERROR JSR PC,GETNUM ;GET NEXT CHARACTER BNE TYPQES ;NO NUMERIC INPUT ALLOWED CMPB #'/,R2 ;SHOULD BE A SLASH BNE TYPQES ;NO ERROR MOV SAVPS,R0 ;GET PROCESSOR STATUS JSR PC,PUTNUM ;TYPE IT JSR PC,GETNEW ;GET NEW VALUE FOR PS BMI TYPQES ;ILLEGAL TERMINATOR TYPE "?" BEQ TYPAT ;NO NEW VALUE MOV R0,SAVPS ;NEW PS VALUE BR TYPAT ;END OF COMMAND ; ;TYPE REGISTER CONTENTS ; 20$: BIC #177770,R0 ;MASK TO 0-7 MOV R0,R3 ;GET REGISTER NUMBER ASL R3 ;CONVERT TO INDEX ADD #SAVR0,R3 ;GET REGISTER ADDRESS MOV R0,R4 ;SAVE REGISTER NUMBER 25$: MOV (R3)+,R0 ;GET REGISTER CONTENTS JSR PC,PUTNUM ;TYPE REGISTER CONTENTS JSR PC,GETNEW ;GET NEW REGISTER CONTENTS BMI TYPQES ;ILLEGAL TERMINATOR TYPE "?" BEQ 27$ ;LEAVE AS IS MOV R0,-2(R3) ;UPDATE REGISTER VALUE 27$: CMPB #LFX,R2 ;LINE FEED ? BNE TYPAT ;NO TERMINATE COMMAND INC R4 ;INCREMENT REGISTER NUMBER CMP R4,#7 ;CHECK FOR DONE BGT TYPAT ;END OF REGISTER TYPE OUT JSR PC,CR ;TYPE CR MOVB #'R,R2 ;GET ASCII "R" JSR PC,PCHAR ;TYPE "R" MOV R4,R2 ;GET REGISTER NUMBER BIS #60,R2 ;MAKE IT ASCII JSR PC,PCHAR ;TYPE REGISTER NUMBER JSR PC,SLASH ;TYPE SLASH BR 25$ ;GO GET ANOTHER REGISTER ; ;TYPE MEMORY CONTENTS ; 30$: CMPB #'/,R2 ;SLASH ? BNE TYPQES ;NO INPUT ERROR MOV R0,R3 ;SAVE ADDRESS 35$: MOV (R3),R0 ;GET CURRENT CONTENTS JSR PC,PUTNUM ;TYPE CURRENT CONTENTS JSR PC,GETNEW ;GET NEW VALUE BMI TYPQES ;ILLEGAL TERMINATOR TYPE "?" BEQ 36$ ;NO NEW VALUE MOV R0,(R3) ;UPDATE MEMORY CELL 36$: CMPB #LFX,R2 ;TERMINATOR A LF ? BNE TYPAT ;NO END OF MEMORY SCAN JSR PC,CR ;TYPE A CARRIAGE RETURN TST (R3)+ ;POINT TO NEXT MEMORY CELL MOV R3,R0 ;GET NEXT ADDRESS JSR PC,PUTNUM ;TYPE NEW ADDRESS JSR PC,SLASH ;TYPE A SLASH BR 35$ ; ;TYPE QUESTION MARK AND RETURN TO TYPAT ; TYPQES: JSR PC,QEST ;TYPE QUESTION MARK BR TYPAT .PAGE .SBTTL CONSOLE I/O ROUTINES ; ;GET OCTAL NUMERIC INPUT ; ; R0=NUMBER INPUT ; R1=NUMBER OF CHARACTERS INPUT(NOT COUNTING TERMINATOR) ; R2=TERMINATOR CHARACTER ; GETNUM: CLR R0 ;CLEAR DATA REGISTER CLR -(SP) ;CLEAR CHARACTER COUNTER 1$: JSR PC,GCHAR ;GET INPUT CHARACTER CMPB R2,#60 ;OCTAL NUMERIC ? BLT 10$ ;NO CMPB R2,#67 ;OCTAL NUMERIC ? BGT 10$ ;NO MOV #16,R1 ;SHIFT COUNT 5$: ROL R2 ;SHIFT HIGH BIT INTO C-BIT SOB R1,5$ ROL R0 ;SHIFT BIT-1 INTO R0 ROL R2 ;GET BIT-2 ROL R0 ;SHIFT BIT-2 INTO R0 ROL R2 ;GET BIT-3 ROL R0 ;SHIFT BIT-3 INTO R0 INC (SP) ;BUMP CHARACTER COUNT BR 1$ ;GET NEXT CHARACTER 10$: MOV (SP)+,R1 ;GET CHARACTER COUNT RTS PC ; ;GET NEW VALUE AND CHECK TERMINATOR FOR "CR" OR "LF" ; ; R0=NUMBER INPUT ; R1=NUMBER OF CHARACTERS INPUT(NOT COUNTING TERMINATOR) ; OR ILLEGAL TERMINATOR FLAG(-1) ; R2=TERMINATOR CHARACTER ; GETNEW: JSR PC,SPACE ;TYPE A LEADING SPACE JSR PC,GETNUM ;GET NEW VALUE IF ANY ? CMPB #LFX,R2 ;LINEFEED ? BEQ 5$ ;YES CMPB #CRX,R2 ;CARRIAGE RETURN ? BEQ 5$ ;YES MOV #-1,R1 ;SET ILLEGAL TERMINATOR FLAG BR 10$ ;EXIT 5$: TST R1 ;TERMINATOR OK TEST CHARACTER COUNT 10$: RTS PC ; ;OUTPUT OCTAL NUMBER ; ; R0=NUMBER TO BE OUTPUT ; R1=DISTROYED ; R2=OUTPUT CHARACTER ; PUTNUM: JSR PC,SPACE ;TYPE A SPACE CLR R2 ;CLEAR CHARACTER REGISTER MOV #6,R1 ;OUTPUT 6 OCTETS BR 6$ ;FIRST ONE IS ONLY ONE BIT 5$: CLR R2 ;CLEAR CHARACTER REGISTER ROL R0 ;BIT-3 TO C-BIT ROL R2 ;SHIFT INTO CHARACTER REGISTER ROL R0 ;BIT-3 TO C-BIT ROL R2 ;SHIFT INTO CHARACTER REGISTER 6$: ROL R0 ;BIT-1 TO C-BIT ROL R2 ;SHIFT INTO CHARACTER REGISTER BIS #60,R2 ;MAKE IT ASCII JSR PC,PCHAR ;OUTPUT CHARACTER SOB R1,5$ RTS PC ; ;INPUT CHARACTER ; ; R2=INPUT CHARACTER ; GCHAR: TSTB @#TKS ;INPUT READY ? BPL GCHAR ;NO MOVB @#TKB,R2 ;GET INPUT CHARACTER JSR PC,PCHAR ;ECHO IT BIC #177600,R2 ;CLEAR PARITY/HIGH ORDER BITS RTS PC ; ;OUTPUT CHARACTER ; ; R2=CHARACTER TO BE OUTPUT ; PCHAR: TSTB @#TPS ;OUTPUT PORT BUSY ? BPL PCHAR ;YES MOVB R2,@#TPB ;OUTPUT CHARACTER RTS PC ; ;TYPE SLASH ; ; R2 IS DISTROYED ; SLASH: MOVB #'/,R2 ;GET SLASH CHARACTER BR TYPE ; ;TYPE QUESTION MARK ; QEST: MOVB #'?,R2 ;GET QUESTION MARK CHARACTER BR TYPE ; ;TYPE A SPACE ; SPACE: MOVB #' ,R2 ;GET SPACE CHARACTER BR TYPE ; ;TYPE CARRIAGE RETURN/LINE FEED ; CRLF: MOVB #LFX,R2 ;GET LINE FEED CHARACTER JSR PC,PCHAR ;TYPE LINE FEED CR: MOVB #CRX,R2 ;GET CARRIAGE RETURN CHARACTER TYPE: JSR PC,PCHAR ;TYPE CHARACTER RTS PC ; ;TYPE OUT ERROR MESSAGES ; ERR1: MOV #MS1,R0 BR ERRX ERR2: MOV #MS2,R0 BR ERRX ERR3: MOV #MS3,R0 BR ERRX ERR4: MOV #MS4,R0 BR ERRX ERR5: MOV #MS5,R0 ERRX: JSR PC,CRLF ;OUTPUT CRLF 1$: MOVB (R0)+,R2 ;GET CHARACTER FROM STRING BEQ 5$ ;END OF STRING JSR PC,PCHAR ;TYPE CHARACTER BR 1$ ;GET NEXT CHARACTER 5$: JMP ODT ; MS1: .ASCIZ /MEMORY TEST ERROR/ MS2: .ASCIZ /DOWN LINE LOAD TIME OUT/ MS3: .ASCIZ /BAD STACK ?/ MS4: .ASCIZ /TIME OUT OR HALT ?/ MS5: .ASCIZ /NO LO-MEMORY ?/ .EVEN ; ;RESTORE REGISTERS ; RSRG: MOV #USER,STATUS ;SET USER MODE MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 MOV (SP)+,R5 MOV (SP)+,SP MTPS SAVPS JMP @SAVPC .PAGE .SBTTL HARDWARE RESTART ; ;HARDWARE RESTART ENTRY(172000) ; .=BREAK+2000 ; START:: JMP PWRUP ;HARDWARE START ADDRESS RSTRX:: JMP RSTRT ;HARDWARE RE-START ADDRESS .PAGE .SBTTL INITIALIZE QNA ; ;INITIALIZE QNA ; LOAD:: MOV #XQSTN,R0 ;STATUS ADDRESS RESET ;RESET QNA JUST IN CASE ?? MOV MEMTOP,R4 ;GET WORK AREA BASE ADDRESS MOV MEMSZ,R5 ;GET MEMORY SIZE(512 BYTE BLOCKS) MOV R4,R1 ;MEMORY WORK AREA BASE ADDRESS MOV #BLKSZ,R2 ;MEMORY WORK AREA SIZE IN WORDS 5$: CLR (R1)+ ;CLEAR WORK AREA SOB R2,5$ ;LOOP ON WORK AREA SIZE TST -(SP) ;RESERVE STACK SPACE MOV #6,R2 ;ADDRESS BYTE COUNT MOV #XBUF+1,R1 ;XMIT SETUP BUFFER ADD R4,R1 ;BASE ADDRESS 10$: MOV (R0)+,(SP) ;GET STN ADDRESS BYTE MOV #7,R3 ;GET NUMBER OF FIELDS/2 11$: MOVB (SP),(R1)+ ;MOVE IT TO SETUP BUFFER FIELD-1 MOVB (SP),77(R1) ;MOVE TO SETUP BUFFER FIELD-2 SOB R3,11$ ;LOOP ON NUMBER OF FIELDS TSTB (R1)+ ;SKIP COLUNM ZERO SOB R2,10$ ;LOOP ON NUMBER OF STATION ADDRESS'S TST (SP)+ ;CLEAN UP STACK MOV R4,R1 ;GET LO-ADDRESS(0-15) CLR R0 ;CLEAR HIGH ORDER PART MOV R4,R2 ;GET BDL 22 BIT ADDRESS POINTER MOV R1,(R2) ;BUILD RBDL1 22 BIT ADDRESS ADD #RBD1,(R2)+ ;ADD OFFSET TO LO-ORDER PART MOV R0,(R2)+ ;STORE HI-ORDER PART MOV R1,(R2) ;BUILD XBDL 22 BIT ADDRESS ADD #XBD,(R2)+ ;ADD OFFSET TO LO-ORDER PART MOV R0,(R2)+ ;STORE HI-ORDER PART ADD #XBUF,R1 ;22 BIT ADDRESS FOR XMIT BUFFER MOV R0,XBD+2(R4) ;STORE HIGH ORDER PART(BITS 16-21) MOV R1,XBD+4(R4) ;STORE LOW ORDER PART(BITS 0-15) ADD #RBUF-XBUF,R1 ;22 BIT ADDRESS FOR REC. BUFFER #1 MOV R0,RBD1+2(R4) ;STORE HIGH ORDER PART(BITS 16-21) MOV R1,RBD1+4(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 ; 20$: MOV R4,R0 ;GET WORK AREA BASE ADDRESS ADD #XBUF,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 25$: MOV (R1)+,R3 ;GET STATION ADDRESS BYTE MOVB R3,(R0)+ ;PUT IT IN BUFFER SOB R2,25$ 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 JMP ERR2 ;ERROR START OVER 31$: CLR XBUF+XBLK(R4) ;RESET BLOCK ADDRESS MOV RBUF+20(R4),XBUF+20(R4) ;GET REAL DLT TASK NAME(1) MOV RBUF+22(R4),XBUF+22(R4) ;GET REAL DLT TASK NAME(2) ADD #1000,-10(R3) ;UPDATE ADR-LO ADC -12(R3) ;UPDATE ADR-HI MOV RBUF+SADR(R4),R0 ;GET FLAG/SYSTEM START ADDRESS BEQ 30$ ;REQUEST NEXT BLOCK BIT #EXEC,STATUS ;EXECUTE IF TRUE BNE 35$ ;GO STARTUP SYSTEM JMP TYPAT ;GO TO ODT 35$: MOV #USER,STATUS ;SET USER STATUS BIT JMP (R0) ;STARTUP SYSTEM .PAGE .SBTTL SEND/RECEIVE PACKETS ; ;SEND REQUEST WAIT FOR REPLY ; SNDREQ: MOV R4,R3 ;GET BASE ADDRESS ADD #XBD,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(R4) ;READ ERROR ? BEQ 1$ ;NO XMIT NEW REQUEST BIT #RUNT,XBUF+XBLK(R4) ;WAS READ ERROR A RUNT ? BNE 2$ ;YES RE-POST RECEIVE 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(R4),XBUF+XBLK(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.../ .IFDF DBUG ; ;************** DEBUG ***************** ; TEMP=167700 DEBUG: MOV SP,TEMP ;SAVE USER STACK MOV #TEMP,SP ;DEBUG STACK MOV R0,-(SP) ;R0 MOV R1,-(SP) ;R1 MOV R2,-(SP) ;R2 MOV R3,-(SP) ;R3 MOV R4,-(SP) ;R4 MOV R5,-(SP) ;R5 MOV TEMP,-(SP) ;SP MFPS -(SP) ;NEW PSW INC -(SP) ;RESTART COUNTER MOV TEMP,SP ;RESTORE USER STACK JMP DBRTN .ENDC END:: .END