.TITLE ABSOLUTE LOADER .PSECT ABSLDR,LCL .GLOBL ABSDT,ABSDTL ; ; ; THIS LOCAL PSECT IS THE ASSEMBLED LISTING OF THE ABSOLUTE ; LOADER WHICH IS DOWNLOADED TO THE LSI. TWO VARIABLES ARE ; DEFINED AS GLOBAL: ; ; ABSDT = START ADDRESS OF ABSOLUTE LOADER ; ABSDTL = LENGTH OF ABSOLUTE LOADER ; ; ; COPYRIGHT 1975 ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASS ; INPUT FORMAT ; FRAME -1 001 ; -2 000 ; -3 BYTE COUNT - LOWER ORDER ; -4 BYTE COUNT - HIGHER ORDER ; -5 LOAD ADDRESS - LOWER ORDER ; -6 LOAD ADDRESS - HIGHER ORDER ; . DATA ; . PLACED ; . HERE ; CKSM - LAST FRAME CONTAINS THE CHECKSUM ; ; IF THE BYTE COUNT IS EQUAL TO 6, THE LOAD ADDRESS ; SPECIFIED WILL BE CONSIDERED TO BE THE DESIRED JUMP ; ADDRESS. IF THIS ADDRESS IS ODD, THE LOADER WILL HALT. ; ; ; IF THE BYTE COUNT IS > 6, DATA WILL BE LOADED INTO MEMORY. ; ; ; L.CKSM = %0 L.ADR = %1 L.BC = %2 L.BYT = %3 R4 = %4 L.PTR = %5 SP = %6 PC = %7 ; ; LD IS LOADED AT THE ABSLOUTE ADDRESS 300(8) BYTES FROM ; THE TOP OF MEMORY. ; THE RELATIVE ADDRESSES INCLUDED HERE ARE OFFSETS ; FROM THAT ADDRESS. ; LD = . BRNCH = LD+374 DEV = BRNCH+2 ; . = .+74 ABSDT: .BYTE 351 .BYTE 75 L.DEV = DEV ;DEVICE ADDRESS IN BOOT LOADER L.LOAD: NOP ; ; START OF LOADER ; L.LD1: MOV PC,SP ;SET UP STACK CMP -(SP),-(SP) ;TO START AT L.LD1-2 MOV PC,L.PTR ;GET RELOCATED ADD #L.READ-.,L.PTR ;START ADDRESS OF READ ROUTINE CLR L.ADR ;CLEAR THE LOAD ADDRESS L.LD1B: MOV (PC)+,@SP ;PICK UP THE CONTENTS OF L.SR: 0 ;THE SOFTWARE SWITCH REGISTER ROR @SP ;CHECK RELOCATION FACTOR BCS L.LD1C ;JUMP IF SOME RELOCATION NEEDED CLR @SP ;USE ADDRESS SPECIFIED ON THE TAPE BR L.LD2 ;GO DO LOAD L.LD1C: ASL @SP ;CHECK FOR NON-ZERO BNE L.LD2 ;JUMP IF LOAD ADDRESS SPECIFIED MOV L.ADR,@SP ;OTHERWISE CONTINUE LOADING FROM LAST LOAD ; ; LOOK FOR BEGINNING OF A BLOCK ; L.LD2: CLR L.CKSM ;INITIALIZE CHECKSUM JSR PC,@L.PTR ;READ A FRAME DECB L.BYT ;CHECK FOR +1 (START OF A BLOCK) BNE L.LD2 ;LOOP UNTIL +1 IS FOUND JSR PC,@L.PTR ;READ ANOTHER FRAME ; ; INPUT AND SAVE BYTE COUNT. IF BYTE COUNT IS EQUAL TO 6 ; GO TO PROCEED JUMP. ; JSR PC,L.GWRD ;GET FULL BYTE COUNT MOV R4,L.BC SUB #4,L.BC ;SUBTRACT 4 TO MAKE BYTE COUNT CORRECT CMP #2,L.BC ;WAS BYTE COUNT EQUAL TO 6? BEQ L.JMP ;JUMP IF NO DATA (I.E. - JUMP BLOCK) JSR PC,L.GWRD ;GET LOAD ADDRESS ADD @SP,R4 ;GENERATE ACTUAL ADDRESS MOV R4,L.ADR ;AND PUT IT INTO PROPER CELL ; ; READ IN REMAINDER OF DATA ; IF THE LOADER HALTS AT L.BAD, A CHECKSUM ERROR ; HAS OCCURED. R3 WILL CONTAIN THE EXPECTED CHECKSUM, ; AND R0 WILL CONTAIN THE DEVIATION FROM THE EXPECTED ; CHECKSUM. ; L.LD3: JSR PC,@L.PTR ;READ A FRAME BGE L.LD4 ;BRANCH IF MORE DATA REMAINS TSTB L.CKSM ;IF CHECKSUM IS BEQ L.LD2 ;CORRECT, THEN CONTINUE L.BAD: HALT ;CHECKSUM ERROR BR L.LD2 ;PRESS "P" TO IGNORE CHECKSUM L.LD4: MOVB L.BYT,(L.ADR)+ ;STORE 8 BITS AT A TIME BR L.LD3 ; THE RE-LOOP ; ; INPUT A FRAME, DECREMENT BYTE COUNT, AND ACCUMULATE CHECKSUM ; L.READ: MOV L.DEV,L.BYT ;DEVICE ADDRESS TO L.BYT INCB @L.BYT ;SELECT READER L.R1: TSTB @L.BYT ;DONE ? BPL L.R1 ;NO MOVB 2(L.BYT),L.BYT ;GET CHARACTER ADD L.BYT,L.CKSM ;ADD TO CHECKSUM BIC #177400,L.BYT ;MASK OFF JUNK DEC L.BC ;DECREMENT BYTE COUNT BY ONE RTS PC ; ; ASSEMBLE ONE FULL WORD OF DATA ; L.GWRD: MOV (SP)+,L.TMP ;SAVE RETURN IN TEMPORARY JSR PC,@L.PTR ;GET ONE CHARACTER MOV L.BYT,R4 ;SAVE R3 IN TEMPORARY JSR PC,@L.PTR ;GET ANOTHER FRAME SWAB L.BYT ;PLACE ANOTHER FRAME BIS L.BYT,R4 ;ASSEMBLE BOTH FRAMES INTO A COMPLETE WORD MOV L.TMP,PC ;RETURN ; ; CHECK CORRECTNESS OF JUMP ADDRESS ; HALT IF ADDRESS IS ODD, JUMP TO PROGRAM IF ADDRESS IS EVEN ; L.JMP: JSR PC,L.GWRD ;GET POSSIBLE TRANSFER ADDRESS JSR PC,@L.PTR ;GET CHECKSUM TSTB L.CKSM ;IF INCORRECT BNE L.BAD ; GOTO CHECKSUM HALT ADDRESS ASR R4 ;GET LOW ORDER BIT BCC L.JMP1 ;SKIP IF ADDRESS IS EVEN HALT ;OTHERWISE HALT BR L.LD1B ;RETURN TO START OF LOADING LOOP L.JMP1: ASL R4 ;RESTORE REGISTER ADD @SP,R4 JMP @R4 ;JUMP TO USER L.TMP: .WORD 0 ;TEMPORARY TO SAVE STACK SPACE ; ; INITIALIZATION TO RESTORE THE BOOTSTRAP LOADER ; L.INIT: MOV #352,LOOP+2 ;RESTORE OFFSET IN BOOTSTRAP LOADER MOV #765,BRNCH ;RESTORE "BR" AT BRNCH JMP L.LOAD ;GO HALT AND WAIT FOR "CONT" ;OVERLAY BOOTSTRAP LOADER CODE ; ;THE FOLLOWING CODE OVERLAYS THE BOOTSTRAP LOADER ; START: MOV DEV,R1 LOOP: MOV (PC)+,R2 .BYTE BRNCH-LD-1 .BYTE - ; ABSDTL=.-ABSDT .PAGE .TITLE LOAD - DOWNLOAD ABSOLUTE LOADER AND TASK IMAGE .IDENT /01/ .PSECT .NLIST BEX ; ; VERSION 01 ; ; BARRY DALLAVALLE 23-MAY-79 ; ; MODIFIED BY: SUSAN HYZER 6-JUN-79 ;SMH ; MODIFIED TO SEND BOOTSTRAP ;SMH ; ;SMH ;SMH ; ;**-1 ; PROGRAM DOWNLOADS THE ABSOLUTE LOADER TO AN LSI FROM THE PDP 11/35 ; THROUGH A USER SPECIFIED TT LINE. PROGRAM THEN SENDS A TASK IMAGE ; TO THE ABSOLUTE LOADER. ; ; MACRO CALLS ; .MCALL QIOW$S,ALUN$S,EXIT$S,LBLDF$,FSRSZ$,MRKT$C,WTSE$C ;SMH .MCALL CSI$,CSI$1,CSI$2,WAIT$,NMBLK$ ;**-1 .MCALL FDBDF$,FDRC$A,FDBK$A,FDOP$A,FINIT$ .MCALL OPEN$R,DIR$,QIOW$,CLOSE$,READ$ LBLDF$ CSI$ ; ; SET UP FDB BLOCK ; FDBLD: FDBDF$ FDRC$A FD.RWM FDBK$A BLK,512.,,,IOSB FDOP$A 2,CSIBLK+C.DSDS,NAMEDF NAMEDF: NMBLK$ ,TSK,,SY,0 ;DEFAULT EXTENSION, DEVICE AND U;SMH ; ;**-1 ; FCS BUFFER ; MACRO FSRSZ$ IS REQUIRED ; BUT A 0 ARGUMENT IS OK FOR BLOCK I/O ; FSRSZ$ 0 ; ; SET UP CSI BLOCK ; CSIBLK: .BLKB C.SIZE .EVEN ; ; MESSAGES TO TI: ; DWNLD: .ASCII <15>'DOWNLOAD LINE? (DDU) = ' DWNLDL=.-DWNLD .EVEN ABSLD: .ASCII <15>'LOAD ABSOLUTE LOADER? ' ABSLDL=.-ABSLD .EVEN BTLD: .ASCII <15>'LOAD BOOTSTRAP LOADER? ' ;SMH BTLDL=.-BTLD ;SMH .EVEN ;SMH TSKLD: .ASCII <15>'ENTER TASK TO LOAD = ' ;SMH TSKLDL=.-TSKLD ;SMH .EVEN ;SMH BOOTER: .ASCII '177560L' ;SMH LENBTR=.-BOOTER ;SMH .EVEN ;**-2 ; ; ERROR MESSAGES ; MSG1: .ASCII <15>'DOWNLOAD LINE ASSIGN ERROR' MSG1L=.-MSG1 .EVEN MSG2: .ASCII <15>'LABEL BLOCK READ ERROR' MSG2L=.-MSG2 .EVEN MSG30: .ASCII <15>'FILENAME SYNTAX ERROR' MSG30L=.-MSG30 .EVEN MSG31: .ASCII <15>'FILENAME PARSE ERROR' MSG31L=.-MSG31 .EVEN MSG32: .ASCII <15>'OPEN FAILURE ON TASK IMAGE FILE' MSG32L=.-MSG32 .EVEN MSG4: .ASCII <15>'ERROR - TASK MUST NOT HAVE A HEADER' .ASCII <12><15>' REBUILD WITH A -HD SWITCH' MSG4L=.-MSG4 .EVEN MSG5: .ASCII <15>'READ ERROR ON TASK IMAGE' MSG5L=.-MSG5 .EVEN MSG6: .ASCII <15>'DOWNLOAD LINE NOT SLAVE' ;SMH MSG6L=.-MSG6 ;SMH .EVEN ;SMH ; ; TASK DESCRIPTOR MESSAGE ; INBLK: .ASCII '%N%15STASK NAME= %2R%5SPARTITION= %2R%N' .ASCIZ '%6SLOAD ADDRESS= %O%5SSIZE= %O%5SENTRY POINT= %O' ; ; MISCELLANEOUS DATA ; OUTBLK: .BLKB 160. ARGBLK: .BLKW 7 DEVICE: .BLKB 4 UNIT: .WORD 0 IOSB: .BLKW 2 FILE: .BLKB 30. VBNADR: .BLKW 2 LBSA: .WORD 0 LBXFR: .WORD 0 ANSR: .BYTE 0 .EVEN ; ; NEXT 3 LINES MUST NOT BE SEPARATED ; DATA: .BLKB 6. BLK: .BLKB 512. CHKSUM: .WORD 0 ; ; PREVIOUS 3 LINES MUST NOT BE SEPARATED ; .EVEN .PAGE ; ; MAIN ROUTINE ; REQUEST INFORMATION FROM USER ; ; DOWNLOAD LINE? ; LOAD ABSOLUTE LOADER? ; TASK TO LOAD? ; ; .ENABL LSB ;SMH LOAD: FINIT$ ;SMH 1$: QIOW$S #IO.DET,#3,#3 ; DETACH IN CASE OF ERROR, OR NE;SMH JSR R5,LINE ;REQUEST AND READ DOWNLOAD LINE ;SMH CMPB #IE.EOF,IOSB ;IF EOF, EXIT FROM ROUTINE ;**-2 BEQ 15$ CMPB #IS.SUC,IOSB ;IS READ SUCCESS? BNE 1$ ;NO, ASK AGAIN CMP #IS.ESC,IOSB ;IF ESCAPE, EXIT FROM ROUTINE BEQ 15$ MOVB #'A,UNIT ;SMH MOV #DEVICE+2,R0 ;SMH CALL $COTB ;SMH MOV R1,UNIT ;SMH JSR R5,ASAT ;ASSIGN LUN AND ATTACH ;SMH TST $DSW ;TEST FOR ERROR ;SMH BGE 3$ ;NO ERROR, CONTINUE ;SMH JSR R5,ERROR ;SEND ERROR MESSAGE ;**-5 .WORD MSG1 .WORD MSG1L BR 1$ ;GO TRY AGAIN 3$: JSR R5,CHKSL ; CHECK IF SLAVE ;SMH TSTB SANS ;SMH BNE 5$ ;SMH JSR R5,ERROR ; PRINT NOT SLAVE MESSAGE ;SMH .WORD MSG6 ;SMH .WORD MSG6L ;SMH BR 1$ ;SMH 5$: JSR R5,ABS ;REQUEST TO LOAD ABSOLUTE LOADER;SMH CMPB #IE.EOF,IOSB ;IF EOF, RESTART ROUTINE ;SMH BEQ 1$ ;SMH CMPB #IS.SUC,IOSB ;IS READ SUCCESS? ;**-3 BNE 5$ ;NO, READ AGAIN CMP #IS.ESC,IOSB ;IF ESCAPE, EXIT FROM ROUTINE BEQ 15$ CMPB ANSR,#'N ;IF NO, GET TASK NAME BEQ 10$ CMPB ANSR,#'Y ;IF ERROR, ASK AGAIN BNE 5$ 7$: JSR R5,BOOT ; REQUEST TO LOAD BOOTSTRAP ;SMH CMPB #IE.EOF,IOSB ; IF EOF, RESTART ROUTINE ;SMH BEQ 1$ ;SMH CMPB #IS.SUC,IOSB ; IS READ SUCCESS ;SMH BNE 7$ ; NO, ASK AGAIN ;SMH CMP #IS.ESC,IOSB ; IF ESCAPED EXIT FROM ROUTINE ;SMH BEQ 15$ ;SMH CMPB ANSR,#'N ; IF NO, DOWNLOAD ABSOLUTE LOADER ;SMH BEQ 9$ ;SMH CMPB ANSR,#'Y ; IF ERROR, ASK AGAIN ;SMH BNE 7$ ;SMH JSR R5,DOWN ; DOWNLOAD BOOT ;SMH .WORD BOOTER ;SMH .WORD LENBTR ;SMH MRKT$C 1,1,2 ;SMH WTSE$C 1 ;SMH 9$: JSR R5,DOWN ;DOWNLOAD ABSOLUTE LOADER ;SMH .WORD ABSDT ;**-1 .WORD ABSDTL 10$: JSR R5,TASK ;REQUEST TASK TO LOAD CMPB #IE.EOF,IOSB ;IF EOF, BACKUP BEQ 5$ CMPB #IS.SUC,IOSB ;IS READ SUCCESS? BNE 10$ ;NO, READ AGAIN CMP #IS.ESC,IOSB ;IF ESCAPE, EXIT FROM ROUTINE BEQ 15$ CALL OPENF ;OPEN TASK IMAGE FILE BCS 10$ ;ERROR, GET ANOTHER TASK CALL TSKMSG ;SEND TASK DESCRIPTOR MESSAGE BCS 10$ ;ERROR, GET ANOTHER TASK CALL DLOAD ;DOWNLOAD TASK IMAGE BR 10$ ;GET ANOTHER TASK 15$: EXIT$S .DSABL LSB ;SMH .PAGE ; ; PARSE INPUT FILE SPECIFIER ; AND OPEN FILE ; OPENF: CSI$1 #CSIBLK,#FILE,#30. ;CHECK SYNTAX OF FILENAME BCC 1$ ;NO ERROR, CONTINUE JSR R5,ERROR .WORD MSG30 .WORD MSG30L BR 3$ ;FAILURE 1$: CSI$2 #CSIBLK,OUTPUT ;PARSE FILENAME, SET UP DATASET DESCRIPTOR BCC 2$ ;NO ERROR, CONTINUE JSR R5,ERROR .WORD MSG31 .WORD MSG31L BR 3$ ;FAILURE 2$: OPEN$R #FDBLD ;OPEN FILE BCC 4$ ;SUCCESS JSR R5,ERROR .WORD MSG32 .WORD MSG32L 3$: SEC ;FAILURE, RETURN WITH CARRY SET RETURN 4$: CLC ;SUCCESS, RETURN WITH CARRY CLEAR RETURN .PAGE ; ; READ LABEL BLOCK OF TASK IMAGE ; AND SET UP ARGUMENT LIST FOR ; TASK DESCRIPTOR MESSAGE ; TSKMSG: CLR VBNADR ;CLEAR HIGH BITS OF DISK ADDRESS MOV #1,VBNADR+2 ;INSERT LABEL BLOCK # IN LOW BITS READ$ #FDBLD,#BLK,#512.,#VBNADR,,#IOSB BCS 10$ ;ERROR ON READ WAIT$ #FDBLD,,#IOSB BCC 1$ ;READ OPERATION SUCCESSFUL 10$: JSR R5,ERROR ;SEND ERROR MESSAGE .WORD MSG2 .WORD MSG2L BR 3$ ;THEN EXIT FROM ROUTINE 1$: MOV #BLK,R3 ;GET START OF LABEL BLOCK DATA MOV L$BFLG(R3),R1 ;GET TASK FLAG WORD BIT #TS$NHD,R1 ;TEST FOR NO HEADER BNE 2$ ;NO HEADER, CONTINUE JSR R5,ERROR ;ELSE SEND ERROR MESSAGE .WORD MSG4 .WORD MSG4L BR 3$ ;THEN EXIT FROM ROUTINE 2$: MOV #ARGBLK,R4 MOV L$BTSK(R3),(R4)+ ;GET TASK NAME MOV L$BTSK+2(R3),(R4)+ MOV L$BPAR(R3),(R4)+ ;GET PARTITION NAME MOV L$BPAR+2(R3),(R4)+ MOV L$BSA(R3),LBSA ;GET LOAD ADDRESS MOV LBSA,(R4)+ MOV L$BMXZ(R3),R1 ;GET TASK SIZE IN 100(8) BYTES .REPT 6 ;MULTIPLY BY 100(8) ASL R1 .ENDR MOV R1,(R4)+ ;GOT TASK SIZE IN BYTES MOV L$BXFR(R3),LBXFR ;GET TRANSFER ADDRESS MOV LBXFR,(R4) MOV L$BHRB(R3),VBNADR+2 ;GET OFFSET-1 TO TASK HEADER INC VBNADR+2 ;ADJUST TO FIRST BLOCK MOV #OUTBLK,R0 ;SET UP ARGUMENTS TO $EDMSG MOV #INBLK,R1 MOV #ARGBLK,R2 CALL $EDMSG ;FORMAT TASK DESCRIPTOR MESSAGE QIOW$S #IO.WAL,#5,#5,,,,<#OUTBLK,R1> ;SEND MESSAGE TO TI: CLC ;SUCCESS, RETURN WITH CARRY CLEAR RETURN 3$: CLOSE$ #FDBLD ;CLOSE ERRONEOUS TASK IMAGE FILE SEC ;FAILURE, RETURN WITH CARRY SET RETURN .PAGE ; ; READ SUCCESSIVE BLOCKS OF THE TASK IMAGE ; DOWNLOADING EACH ONE TO LSI WITH A CHECKSUM ; DLOAD: READ$ #FDBLD,#BLK,#512.,#VBNADR,,#IOSB BCS 2$ ;ERROR, CHECK IT OUT WAIT$ #FDBLD,,#IOSB BCS 2$ ;ERROR, CHECK IT OUT MOV #1,DATA ;ELSE SEND BLOCK, INSERT START WORD MOV #512.+6.,DATA+2 ;INSERT BYTE COUNT MOV LBSA,DATA+4 ;INSERT LOAD ADDRESS MOV #DATA,R0 ;COMPUTE CHECKSUM FOR ALL CLR CHKSUM ;START NEW CHECKSUM MOV #518.,R4 ;518 BYTES OF DATA 1$: MOVB (R0)+,R1 ;GET NEXT BYTE SUB R1,CHKSUM ;COMPUTE CHECKSUM SOB R4,1$ JSR R5,DOWN ;DOWNLOAD DATA AND CHECKSUM .WORD DATA .WORD 519. ADD #512.,LBSA ;INCREMENT LOAD ADDRESS INC VBNADR+2 ;POINT TO NEXT BLOCK BR DLOAD ;GO GET NEXT TASK BLOCK 2$: MOV #FDBLD,R0 ;GET FDB ADDRESS CMPB #IE.EOF,F.ERR(R0) ;WAS IT AN EOF ERROR BEQ 3$ ;YES, SEND TRANSFER ADDRESS JSR R5,ERROR ;NO, SEND ERROR .WORD MSG5 .WORD MSG5L BR 5$ ;EXIT 3$: MOV #1,DATA ;INSERT START WORD MOV #6.,DATA+2 ;INSERT BYTE COUNT MOV LBXFR,DATA+4 ;INSERT TRANSFER ADDRESS MOV #DATA,R0 ;COMPUTE CHECKSUM FOR ALL CLR CHKSUM ;START NEW CHECKSUM MOV #6.,R4 ;6 BYTES OF DATA 4$: MOVB (R0)+,R1 ;GET NEXT BYTE SUB R1,CHKSUM ;COMPUTE CHECKSUM SOB R4,4$ MOVB CHKSUM,BLK ;MAKE DATA AND CHECKSUM CONTIGUOUS JSR R5,DOWN ;SEND DATA + CHECKSUM .WORD DATA .WORD 7. 5$: CLOSE$ #FDBLD ;CLOSE TASK IMAGE FILE RETURN .PAGE ; ; LOCAL MACROS ; ;+ ; LINE - PROMPT AND READ DOWNLOAD LINE ; ;- LINE: QIOW$S #IO.WLB,#5,#5,,,,<#DWNLD,#DWNLDL,#'$> ;PROMPT FOR DOWN LINE QIOW$S #IO.RLB,#5,#5,,#IOSB,,<#DEVICE,#4> ;READ DEVICE NAME RTS R5 ;+ ; ABS - ASK TO LOAD ABSOLUTE LOADER AND READ ANSWER ; ;- ABS: QIOW$S #IO.WLB,#5,#5,,,,<#ABSLD,#ABSLDL,#'$> ;PROMPT FOR ABS LOADER QIOW$S #IO.RLB,#5,#5,,#IOSB,,<#ANSR,#1.> ;READ ANSWER TO LOAD ABS RTS R5 ;+ ; BOOT - ASK TO LOAD BOOT ;SMH ; ;SMH ;- ;SMH BOOT: QIOW$S #IO.WLB,#5,#5,,,,<#BTLD,#BTLDL,#'$> ; PROMPT FOR BOO;SMH QIOW$S #IO.RLB,#5,#5,,#IOSB,,<#ANSR,#1> ; READ ANSWER TO;SMH RTS R5 ;SMH ;+ ;SMH ; CHKSL - CHECK IF SLAVE ;SMH ; ;SMH ;- ;SMH SLAVE: .BYTE 50 ; SLAVE ATTRIBUTE ;SMH SANS: .BYTE 0 ; GET ATTRIBUTE ;SMH .EVEN ;SMH CHKSL: QIOW$S #SF.GMC,#3,#5,,,,<#SLAVE,#2> ; SET LSI AS SLA;SMH RTS R5 ;SMH ;SMH ;+ ;SMH ; TASK - PROMPT FOR TASK NAME AND READ IT IN ; ;- TASK: QIOW$S #IO.WLB,#5,#5,,,,<#TSKLD,#TSKLDL,#'$> ;PROMPT NAME OF TASK MOV #FILE,R0 ;GET ADDRESS OF FILENAME BUFFER MOV #15,R1 ;GET WORD COUNT 1$: CLR (R0)+ ;CLEAR EACH WORD SOB R1,1$ ;DO ALL WORDS QIOW$S #IO.RLB,#5,#5,,#IOSB,,<#FILE,#30.> ;READ FILENAME RTS R5 ;+ ; DOWN - DOWNLOAD DATA TO LSI ; ; CALLING SEQUENCE: ; JSR R5,DOWN ; .WORD ADDR ; .WORD LENGTH ; ;- DOWNQ: QIOW$ IO.WAL,3,3,,,,<0,0> ; ; DOWN: MOV (R5)+,DOWNQ+Q.IOPL MOV (R5)+,DOWNQ+Q.IOPL+2 DIR$ #DOWNQ RTS R5 ;+ ; ASAT - ASSIGN DOWNLOAD LINE AND ATTACH TO TASK ; ;- ASAT: ALUN$S #3,DEVICE,UNIT ;ASSIGN DOWN LINE TO LUN 3 TST $DSW ;ERROR? BMI 1$ ;YES, SEND ERROR MSG QIOW$S #IO.ATT,#3,#3 ;ATTACH DOWNLOAD LINE ;SMH 1$: RTS R5 ;**-1 ;+ ; ERROR - SEND ERROR MESSAGE TO TI: AND RETURN ; ; CALLING SEQUENCE: ; JSR R5,ERROR ; .WORD ADDR ; .WORD LENGTH ; ;- ERRORQ:QIOW$ IO.WLB,5,5,,,,<0,0,40> ; ; ERROR: MOV (R5)+,ERRORQ+Q.IOPL MOV (R5)+,ERRORQ+Q.IOPL+2 MOV #40,ERRORQ+Q.IOPL+4 DIR$ #ERRORQ RTS R5 .END LOAD