; LOD11.P11 LOADER= 157500 ; STARTING ADDRESS OF DEC ABSOLUTE LOADER START = 74000 ; STARTING ADDRESS OF THIS PROGRAM ; ; PDP-10 --- PDP-11 LOADER PROGRAM ; VER 2 OCTOBER 7, 1971 RICHARD B. FLEISHER ; ; THE PURPOSE OF THIS PROGRAM IS TO ALLOW A USER AT THE PDP-11 ; TELETYPE TO HAVE TWO WAY COMMUNICATION WITH THE PDP-10. ; FURTHERMORE IT ALLOWS A PROGRAM ASSEMBLED ON THE PDP-10 TO BE ; LOADED INTO CORE ON THE PDP-11. ; ; INTERRUPTS ARE SERVICED FOR THE TELETYPE KEYBOARD AND PRINTER ; AS WELL AS THE DC-11 RECEIVE MODE. DC-11 TRANSMIT IS HANDLED BY ; CHECKING THE READY FLAG. ; ; DATA COMING FROM THE PDP-10 AT 1200 BAUD IS BUFFERED AND TELETYPE ; PRINTER OVERLAPPED WITH IT. WHEN A BUFFER LOAD IS ; RECEIVED A STOP IS SENT TO THE PDP-10 MONITOR (CODE 200/8) ; ANY CHARACTERS IN THE LINE WHEN THE STOP IS SENT ARE BUFFERED ALSO. ; WHEN THE PRINTER IS DONE PUTTING OUT THE BUFFER, A START IS SENT TO ; THE PDP-10 MONITOR (CODE-0). NOTE: A PATCH HAD TO BE PUT INTO THE ; PDP-10 MONITOR BY DEC TO ACCEPT AND RECOGNIZE THESE CODES. ; ; THE CORE LOAD BEGINS WITH A SPECIAL CHARACTER 243/8 COMING FROM ; THE PDP-10. SIX BITS OF DATA ARE USED - BIT 6 ALWAYS ; SET FOR BINARY DATA. ; ; THE PDP-11 LOADER IS USED WITH ALL ITS FEATURES TO LOAD CORE. ; FIVE WORDS ARE OVERLAID TO ACCOMPLISH THIS. THESE ARE ; REPLACED IF A TAPE IS TO BE LOADED LOCALLY BY STARTING THE MACHINE ; AT (ABSOLUTE LOADER ADDRESS - 100/8) ; AT END OF DEC LOADER THIS PROGRAM PUT A LINK BACK DONT OVER LAY ; ; A CHECKSUM ERROR CAUSES A 243/8 TO BE SENT TO THE PDP-10 AND ; AN IMMEDIATE CHANGE TO CONVERSATION MODE. A GOOD LOAD IS FOLLOWED ; BY A 15/8 SENT TO THE PDP-10. ; EACH TIME A GOOD PDP11 BLOCK IS SENT A "CR" IS SENT, MEANS OK ; ; THE PDP-10 WILL TRY A MAXIMUM OF 8 TIMES TO LOAD CORE ; EACH PRECEEDED WITH A 243/8. ; ; THIS PROGRAM MAY BE ASSEMBLED ANYWHERE IN CORE BY CHANGING THE ; VALUE OF (START). (LOADER) SHOULD BE SET EQUAL TO THE STARTING ; ADDRESS OF THE DEC ABSOLUTE LOADER (V005A). ; ; THE PROGRAM IS NOW SET TO BE USED WITH A DC-11 AB AT 1200 BAUD. ; THE CONTROL BITS FOR THE DC-11 STATUS REGISTERS ARE SET BY THE ; FOLLOWING TWO EQUALITIES. CONT1= 21 ; FOR TRANSMIT: REQUEST TO SEND, 1200 BAUD CONT2= 121 ; FOR RECEIVE: INTERRUPT ENABLE,1200 BAUD ; ; ; START OF MAIN PROGRAM ; .=START ; DEFINE REGISTERS R0= %0 R1= %1 R2= %2 R3= %3 R4= %4 R5= %5 SP= %6 PC= %7 ; INITIALIZE FLAGS AND VARIABLES ; BEGIN: MOV #340, PS ; INHIBIT INTERRUPTS MOV #.-8., SP ; INITIALIZE STACK POINTER MOV #60, R0 ; READY TO SET VECTORS MOV #TTYK, (R0)+ MOV #200, (R0)+ ; KEYBOARD VECTOR MOV #TTYP, (R0)+ MOV #200, (R0)+ ; PRINTER VECTOR MOV #PD10S, @#300 MOV #300, @#302 MOV #1, INTOF ; SET FLAG PRINTER HAS NOT BEEN STARTED CLR R1 MOV R1, FLOUT ; DOWN FLAG WHICH TELLS PRINTER ; ROUTINE CHARACTER TO BE ECHOED MOV R1, FLG2 ; DOWN FLAG - BYTE READY FOR LOADER MOV R1, BDF ; DOWN BINARY DATA FLAG ; OVER-LAY LOADER TO MAKE LINKAGE BACK TO THIS PROGRAM ; L.BAD=LOADER+112 ;FORM ADDRESS IN LOADER MOV JUMP, L.BAD ; PUT INSTRUCTION IN LOADER MOV JUMP+2, L.BAD+2 MOV JUMP3, L.BAD-2 MOV JUMP4, LOADER+224 MOV JUMP4+2, LOADER+226 BR ON ; ; JUMP: JMP @#CHERR ; A JUMP TO ERROR IN MAINLINE JUMP2: JMP @#FINE ; OK LOADER FINISHED -- JUMP BACK JUMP3: 1445 ; = BEQ OKBLK LINKS TO IT JUMP4: JMP @#OKBLK ; THIS IS PUT AT END OF LOADER LPJMP= LOADER+206 ; FORM ADDRESS IN LOADER ON: MOV JUMP2, LPJMP ; PUT INSTRUCTION IN LOADER MOV JUMP2+2, LPJMP+2 ; INITIALIZE POUT, PIN AS ADDRESS POINTERS TO BUFFER ; MOV #BUFR, POUT MOV #BUFR, PIN ; ; MOV #20., COUTR ; INITIALIZE COUNTER MOV #2, SEQ ; INITIALIZE SEQUENCE COUNTER ; ; ; INITIALIZE TELETYPE AND PDP-10 CONTROL REGISTERS ; TKS= 177560 ; TYP KEYBOARD STATUS TKB= 177562 ; TYP KEYBOARD BUFFER TPS= 177564 ; TYP PRINTER STATUS TPB= 177566 ; TYP PRINTER BUFFER MOVB TKB, SAVT ; CLEAR DONE FLAG IF SET ON KEYBOARD MOVB #0, TPB ; OUTPUT DUMMY CHARACTER TO INSURE THAT ; READY FLAG WILL BE UP WHEN INT ENABLED MOV #100, TKS ; ENABLE INTERRUPT PD10= 174004 ; TRANSMITTER STATUS REGISTER PDBUF= 174006 ; TRANSMITTER BUFFER REGISTER P10RS= 174000 ; RECEIVER STATUS REGISTER P10RD= 174002 ; RECEIVER BUFFER REGISTER MOV P10RD, SAVT ; CLEAR DONE FLAG IF UP -- RECIEVER CLR PDBUF ; SET TRANSMITT READY MOV #CONT1, PD10 ; SET SPEED TRANS 1200 MOV #CONT2, P10RS ; SET INT AND SPEED RECEV ; MOVB #0, PDBUF PS= 177776 ; STATUS REGISTER CLR PS ; SET PRIORITY TO 0 BR RETURN SAVT: .WORD 0 ; TEMPORARY STORAGE ; ; VARIABLES ; INTOF:.WORD 0 ;FLAG- INTERRUPT SEQUENCE IN PROGRESS FLOUT: .WORD 0 ;FLAG- INDICATES WHERE TO ECHO CH. FLG2: .WORD 0 ;FLAG- INDICATES MUST CALL LOADER BDF: .WORD 0 ;FLAG- BINARY DATA COMING POUT: .WORD 0 ; DATA OUT -- POINTER TO BUFFER PIN: .WORD 0 ;DATA IN POINTER TO BUFFER COUTR: .WORD 0 ;COUNTER -- TELLS WHEN TO SHUT OFF PDP-10 SEQ: .WORD 0 ; SEQUENCE COUNTER FOR PDP-10 SERVICE ; ; BUFR: .WORD 0 ; ROTATING BUFFER .=.+44. ; 20 WORDS + 2 WORDS FOR CHARACTERS CAUGHT IN LINE AFTER STOP ; MAIN LINE ROUTINE ; ; CHECK BUFFER TO SEE IF PRINTER NEEDS TO BE STARTED. OUTPUT FIRST ; CHARACTER ONLY. ; ; ; ; ; ; ; RETURN: TST INTOF ; IS INTOF SET BEQ NO ; BRANCH IF NO CMP POUT, PIN BEQ NO ; POINTERS EQU -- NO INFO. TO GO OUT ; OUTPUT CHARACTER TO PRINTER ; ; BAC: TSTB TPS ; CHECK READY FLAG BPL BAC MOVB @POUT, TPB ; MOVE TO BUFFER ADD #2, POUT ; INCREMENT OUTPUT POINTER BY 2 ; CHECK IF POINTER IS PAST BOTTOM OF BUFFER AND ; NEEDS TO BE REPOSITIONED ; CMP POUT, #BUFR+44. BEQ OK ;IF = OK BMI OK ; IF LESS THAN OK MOV #BUFR, POUT ;IF GREATER OK: MOV #0, INTOF ;DOWN INTOF SINCE FURTHER OUTPUTS MOV #100, TPS ; ENB INT ON TTY PRINTER ; WILL BE HANDLED BY INTERRUPT HANDLER NO: TST FLG2 ; CHECK FLG2 TO SEE IF BYTE READY ; FOR LOADER BEQ RETURN ; LOOP MOV #IO, R5 ; YES -- SO INITIALIZE R5 FOR USE ; BY THE LOADER IN CALLING FOR I/O L.LDIB= LOADER+14 ; ENTRY TO LOADER CMP #1, SR ; CLEAR R1 IF ABSOLUTE , OR RELOCATED BEQ X2 ; LOAD SPECIFIED BY SWITCHES CLR R1 ; DO NO CLEAR IF CONTINUING ; X2: JMP L.LDIB ; GO TO DEC LOADER PROGRAM ; ; ; ; ROUTINE WHICH REPLACES I/O SECTION IN LOADER ; CALLED L.READ ; ; ; ; ; IO: TST FLG2 ; TEST BYTE READY FLAG BEQ IO ; LOOP HERE UNTIL 8 BIT BYTE READY CLR FLG2 ; CLEAR FLAG MOVB SAVE, R3 ; MOVE DATA TO LOADER JMP LOAD ; GO BACK TO LOADER LOAD= LOADER+140 ; ADDRESS OF RETURN SAVE: .WORD 0 ; ROUTINE SENDS A "CR" TO THE PDP10 TO TELL ; IT RECEIVED THE PDP11 BLOCK OK. OKBLK: TSTB PD10 ; TEST READY BPL .-4 MOVB #215,PDBUF ; SIGNAL BLOCK OK JMP LOADER+40 ; LOOK FOR BEGINNING OF BLOCK ; RETURN HERE IN CASE OF CHECKSUM ERROR IN INPUTTED PROGRAM ; BEING PROCESSED BY THE LOADER ( MIDDLE BLOCKS OR END) ; ; ; ; CHERR: MOV #340, PS TSTB PD10 ; TEST IF 10 READY BPL .-4 MOVB #17, PDBUF ; SEND 17/8 TO PDP-10 TSTB PD10 BPL .-4 MOVB #243, PDBUF ; SEND 243/8 TO PDP-10 TSTB PD10 BPL .-4 MOVB #215, PDBUF ; SEND 215/8 TO PDP-10 BR ON1 ; ; ; RETURN HERE IF A SATISFACTORY CORE LOAD WAS MADE ; ; ; FINE: MOV #340, PS TSTB PD10 ; TEST READY BPL .-4 MOVB #215, PDBUF ; SEND CARRIAGE RETURN ; INITIALIZE THE PACK ROUTINE IN PDP-10 INTERRUPT HANDLER ; ON1: CLR R0 MOV R0, FLG2 MOV R0, BDF ; DOWN BYTE READY AND BINARY DATA FL MOV #2, SEQ ; INITIALIZE MOV P10RS, R0 ; CLEAR ERROR BIT IF UP CLR PS JMP RETURN ; RETURN TO MAIN LOOP ; ; TELETYPE KEYBOARD INTERRUPT SERVICE ; ; ; TTYK: TSTB TKS ; ACCEPT CHARACTER BPL END1 ; EXIT MOVB TKB, CHRET ; SAVE CHARACTER TST INTOF BEQ T1 ; T2: TSTB TPS ; WAS SET - SO ECHO BPL T2 ; TO PRINTER MOVB CHRET, TPB BR T3 T1: INC FLOUT ; SET FLOUT IN PRINTER INTERR. HANDLER ; ; ; T3: TSTB PD10 BPL T3 MOVB CHRET, PDBUF ; SEND CHARACTER TO PDP-10 END1: RTI ; INTERRUPT RETURN CHRET: .WORD 0 ; ; TELETYPE PRINTER INTERRUPT HANDLER ; ; ; ; ; TTYP: TST FLOUT BNE TT1 ;BRANCH IF SET CMP POUT, PIN ; NOT SET-- CHECK BUFFER BEQ TT2 ; TT3: TSTB TPS ; YES- TEST PRINTER BPL TT3 MOVB @POUT, TPB ; OUTPUT NOW ADD #2, POUT ; INCREMENT BUFFER ADDRESS POINTER. ; CHECK TO SEE IF PAST BOTTOM OF BUFFER AND NEEDS TO BE RE-POSITIONED ; CMP POUT, #BUFR+44. BEQ TT4 BMI TT4 MOV #BUFR, POUT ; MOVE TO TOP OF BUFFER ; TT4: RTI ; RETURN TT2: BIS #1, INTOF ; SET TABLE EMPTY FLAG CLR TPS ; TURN OFF INTERRUPT FOR PRINTER ; TT5: TSTB PD10 ; TELL PDP-10 TO GO IF NOT ALREADY GOING BPL TT5 MOVB #0, PDBUF BR TT4 ; ECHO CHARACTER TYPED FROM KEYBOARD ; ; ; TT1: TSTB TPS ; CHECK IF READY BPL TT1 MOVB CHRET, TPB ; OUTPUT CLR FLOUT ; CLEAR FLOUT BR TT4 ; ; ; ; ; ; ; INTERRUPT FROM PDP-10 RECEIVE DATA SERVICE ROUTINE ; ; ; ONLY 6 BITS OF DATA ARE SENT AT A TIME. THE DISK FILE ; IS UNPACKED AT THE 10 END AND PACKED HERE. WHEN 8 BITS ARE BUILT, THEY ; ARE SENT TO THE DEC ABSOLUTE LOADER. ; ; PD10S: BIT #100000,P10RS ; ANY ERRORS NOT PARITY BMI RCVERR ; HAVE ERROR PD10S1: MOV R0, EXT1+2 ; SAVE CONTENTS OF REGISTER MOV R1, EXT2+2 ; SAVE CONTENTS OF REGISTER ; PD6: TSTB P10RS ; ACCEPT DATA IF RECEIVER READY BPL PD5 MOVB P10RD, PHOLD TST BDF ; CHECK BINARY DATA FLAG BNE PD1 ; WAS SET ; ; CHECK FOR 243/8 CMPB #243, PHOLD BEQ PD2 ; BRANCH IF WAS 243/8 ; WAS VALID ASCII CH. -- PUT IN BUFFER PD8: MOV PIN, R0 MOVB PHOLD, (R0)+ INC R0 ; CHECK TO SEE IF PAST BOTTOM OF BUFFER AND NEEDS TO BE REPOSITIONED CMP R0, #BUFR+44. BEQ PD3 BMI PD3 MOV #BUFR, R0 ; POSITION TO TOP OF BUFFER ; PD3: MOV R0, PIN ; REPLACE ; SEE IF STOP OF PDP-10 SHOULD BE ORDERED NOW DEC COUTR ; DECREMENT COUNTER BEQ PD4 ; YES-- STOP PDP-10 PD5: JMP EXT2 ; END ; PXERR: MOV #CHERR, (SP) ;ERROR EXIT PXERR1: RTI RCVERR: TST BDF ; BINARY DATA ? BEQ PXERR1 ; NO,ASC DATA BR PXERR ; YES, RESEND DATA PD4: TSTB PD10 ; STOP PDP-10 IF READY BPL PD4 MOVB #200, PDBUF MOV #20., COUTR ; RESET COUNTER BR PD5 ; END ; PD2: TST SR BNE PD11 ; PD12: INC BDF BR PD5 ; PD11: BIT #1, SR BNE PD12 BR PD8 ; ENTRY POINT FOR BINARY DATA FOLLOWING 243 ; EACH IS A SIX BIT GROUP OF DATA Z-- NEEDS TO BE PACKED ; ; SR = 177570 PD1: BIT #100, PHOLD ; IS BIT 6 SET BEQ PD5 ; WAS NOT BINARY BR PD9 PD7: CLR BDF BR PD8 PD9: BICB #300, PHOLD BIT #40, P10RS ; CHECK EVEN PARITY BNE PXERR ; NOT EVEN PARITY ERROR MOV SEQ, R0 ; PACK - PICK UP SEQUENCE JMP @PDSX(R0) ; NUMBER ; ; PDSX: .WORD 0,S1,S2,S3,S4 ; ; ACTUAL PACK IS DONE HERE ; S1: ASL SEQ ; INCREMENT POINTER TO 4 ASL PHOLD ; SHIFT LEFT ASL PHOLD MOVB PHOLD, HOD1 ; STORE BR PD5 ; S2: MOV #6, SEQ MOVB PHOLD, R1 ASR R1 ; SHIFT RIGHT 4 ASR R1 ASR R1 ASR R1 BISB R1, HOD1 ; COMBINE WITH FIRST MOVB HOD1, SAVE ; 6 BITS BIS #1, FLG2 ; SET FLG2 ; CONDITION OTHER PART OF WORD BICB #360, PHOLD ; MASK OFF MOVB PHOLD, R1 ASL R1 ;@SHIFT LEFT 4 ASL R1 ASL R1 ASL R1 MOVB R1, HOD1 BR EXT2 ; ; S3: MOV #10, SEQ MOV PHOLD, R1 ASR R1 ; SHIFT RIGHT 2 ASR R1 BISB R1, HOD1 ; COMBINE MOVB HOD1, SAVE ; 2ND BYTE COMPLETE BIS #1, FLG2 ; SET FLAG BICB #374, PHOLD ; LEAVE 2 BITS MOVB PHOLD, R1 SWAB R1 ; SWAP BYTES ASR R1 ; POSITION ASR R1 MOVB R1, HOD1 ;SAVE 2 BITS BR EXT2 ; S4: MOV #2, SEQ ; RESET SEQUENCE BISB PHOLD, HOD1 ; COMBINE MOVB HOD1, SAVE BIS #1, FLG2 ; RESET FLAG ; EXT2: MOV #0, R1 ; ; EXT1: MOV #0, R0 RTI ; REPLACE REGISTER AND EXIT ; PHOLD: .WORD 0 HOD1: .WORD 0 ; ; ; ; ************************************************************ ; ; START HERE TO RE- INITIALIZE LOADER FOR LOCAL USE ; .=LOADER-100 ; CONSTANT MAY BE CHANGED ; BUT CAREFULL DO NOT OVERLAY LOADER OR ITS STACK MOV #1753, L.BAD-2 ; BEQ L.LD2 MOV #0, L.BAD MOV #751, L.BAD+2 MOV #6204, LPJMP MOV #103002,LPJMP+2 JMP LOADER .END BEGIN