; PDP-11 LINK TEST PROGRAM PAL-11 VERSION(LKP11) .ABSOLUTE ;REG DEFINITION R1=%1 R2=%2 R3=%3 TEMP=%4 R5=%5 SP=%6 ;STACK PTR PC=%7 ;PROG. CTR. PS=777776 ;PSW ;******************** ;CONDITIONALS HERE BIT9=1 ;BIT9=1 FOR 9-BIT OPTION ;OMIT 'BIT9=1' FOR 8-BIT OPTION PRAV=1 ;PRAV=1 IF STD KEYBOARD/PRINTER AVAILABLE ;OMIT 'PRAV=1' IF NOT AVAILABLE ;******************** ;******************** ;USEFULL INSTRUCTIONS ;BR .+2 000401 ;BR .+1 (NOP) 000400 ;BR . (JMP SELF) 000777 ;USEFULL OP CODES(ADD AN 8-BIT SIGNED OFFSET) ;BR 000400 ;BEQ 001400 ;BNE 001000 ;BPL 100000 ;BMI 100400 ;******************** KBADRS=777560 ;KBD. DEV. ADDRESS PRADRS=777564 ;PRINTER DEV. ADDRESS RXADRS=777550 ;LINK DEV. ADDRESS TXADRS=777554 RXVLOC=070 ;LINK INTERRUPT VECTOR LOCATIONS RXVPSW=072 TXVLOC=074 TXVPSW=076 INTOFF=340 ;CPU PRIORITY 7 INTON =140 ;CPU PRIORITY 3 K1000=1000 .=0 .WORD HLT0,340,HLT4,340,HLT10,340 .=20 .WORD HLT20,340 .=1000 BGN: MOV #INTOFF,@#PS ;INTERRUPTS OFF MOV #1000,SP ;SET STACK PTR ;******************** .IFDF PRAV ;ASS. IF PRINTER AVAIL. MSGPTR=%0 ;PTR TO REQD. MESSAGE MOV LLNGTH,CCTR MOV #PRADRS,R2 ;PR. DEV ADDRESS IN R2 MOV #CRLF,MSGPTR JSR PC,PRINT ;DO CR/LF JSR PC,NULLS ;DO NULLS MOV #HEAD,MSGPTR ;START OF STRING JSR PC,PRINT ;PRINT HEADING JSR PC,NULLS ;PRINT NULLS BR BGNB ;PROGRAM HEADING .IFDF BIT9 HEAD: .ASCII /PDP-11 LINK DIAGNOSTIC(9-BIT)/ .BYTE 15,12,0 .EVEN .ENDC .IFNDF BIT9 HEAD: .ASCII /PDP-11 LINK DIAGNOSTIC(8-BIT)/ .BYTE 15,12,0 .EVEN .ENDC .ENDC ;******************** R0=%0 BGNB: MOV PLCNT,PLCTR ;SET UP MAIN-LOOP CTR. CLR TEMP ;SET-UP DELAY MOV #14,DEL ;MIN OF 2 SECS. JSR PC,DELAY ;DELAY TO ENSURE LK TIMEOUTS MLPENT: MOV #K1000,LPCTR ;COMPLETE. MOV #INTOFF,@#PS ;INTERRUPTS OFF MOV #RXADRS,R0 ;LK RX CSR ADRS TO R0 MOV #TXADRS,R2 ;LK TX CSR ADRS TO R2 TST1: TST (R0) ;ALL RX CSR BITS CLR? BEQ L101 HALT ;NO L101: BIT ONES,(R2) ;CHK. TX BITS BPL L201 ;ERR BIT SET? HALT ;YES L201: CMP #200,(R2) BEQ L301 ;TX BITS 14-0 OK? HALT ;NO ;CHECK EFFECT ON CSR'S OF USING UNASSIGNED COMMAND BITS AND ;ALSO ON THE SETTING AND CLEARING OF ASSIGNED COMMAND BITS. L301: MOV #177671,(R0) ;COMPLEMENT OF RX COMMAND BITS TST (R0) BEQ L401 ;RX CSR=0? HALT L401: MOV #177675,(R2) ;YES. COMP. OF TX CMND. BITS BIT ONES,(R2) BPL L501 ;TX ERR. BIT OK? HALT L501: CMP #200,(R2) ;YES. TX CSR OK? BEQ L601 HALT ;NO. L601: MOVB #104,R4 MOVB R4,(R0) ;SET RX INTENB AND HOLD BITS CMPB R4,(R0) BEQ L701 ;BITS SET? HALT L701: BICB R4,(R0) ;YES. CLR RX INTENB MOVB 2(R0),R4 ;CLEAR HOLD TSTB (R0) BEQ L801 ;BITS CLR? HALT L801: MOVB #100,(R2) ;YES. SET TX INTENB BIT CMPB #300,(R2) BEQ L901 ;TX INTENB AND RDY SET? HALT L901: BICB #100,(R2) ;YES. CLR TX INTENB CMPB #200,(R2) BEQ FIN1 ;TX INTENB CLR,RDY BIT SET? HALT FIN1: DEC LPCTR ;YES. OK BNE TST1 ;END OF LOOP? JMP TST2 ;YES. (JMP TO ANY TEST) ONES: 177777 ;CHECK TX ERR BIT,RX AND TX RESET COMMANDS.(TST2) ;SETS TX AND RX CSR BITS, ISSUES RX RESET THEN WAITS ;BEFORE TRANSMITTING DATA. THIS ACTION SHOULD FORCE ;THE SETTING OF THE TX ERR BIT. CHECKS ARE ALSO DONE TO ENSURE ;THAT A RESET HAS THE DESIRED EFFECT ONLY ON THE INTENDED ;CSR AND NOT THE OTHER. TST2: MOVB #100,(R2) ;SET TX INTENB BIT TST (R2) BPL L102 ;TX ERR BIT SET? HALT ;YES. WHY? L102: CMP #300,(R2) BEQ L202 ;TX INTENB AND RDY BITS SET? HALT ;NO. WHY? L202: MOVB #104,(R0) ;SET RX INTENB AND HOLD BITS CMP #104,(R0) BEQ L302 ;RX RDY CLR,INTENB,HOLD BITS SET? HALT ;NO. WHY? L302: MOVB #2,(R0) ;ISSUE RX RESET TST (R0) BEQ L402 ;RX RDY,INTENB,HOLD CLR? HALT ;NO. WHY? L402: CMP #300,(R2) BEQ L502 ;RX RESET SHOULD HAVE NO HALT ;EFFECT ON TX CSR L502: MOV SETDEL,TEMP ;SET-UP DELAY MOVB #1,DEL JSR PC,DELAY ;WAIT MOV DATA,R3 MOV R3,2(R2) ;SEND DATA. FORCES TX ERR ;DUE TO RX RESET MOV #12,TIMLIM ;SET TIMER TO 2 SECS MAX WAIT CLR TEMP ;SET-UP 200MS DELAY MOVB #1,DEL TST (R0) BEQ L902 HALT ;RX RDY CHECK IN CASE RX RESET ;DELAY NOT TRIGGERED OR TOO ;SHORT. L902: JSR PC,DELAY ;WAIT ANOTHER 200MS TST (R0) BEQ L602 ;RX CSR CLR? HALT ;NO. WHY? L602: TST (R2) BPL L702 ;ERR BIT SET? HALT ;YES. TOO SOON L702: CMP #100,(R2) ;TX RDY CLR,INTENB SET? BEQ L802 HALT ;NO. WHY? L802: MOVB #104,(R0) ;SET RX INTENB AND HOLD BITS JSR PC,TIMER ;WAIT FOR TX RDY OR 2 SECS. TST (R2) BMI A ;ERR BIT SET? HALT ;NO. WHY? A: MOVB #2,(R2) ;ISSUE TX RESET TST (R2) BPL L102A ;ERR BIT CLR? HALT ;NO. WHY? L102A: CMP #200,(R2) ;TX RDY SET,INTENB CLR? BEQ L202A HALT ;NO. WHY? L202A: CMP #104,(R0) ;TX RESET SHOULD HAVE NO EFFECT BEQ L302A ;ON RX CSR HALT ;RX CSR CHANGED! WHY? L302A: CMP #5,TIM BLOS L402A ;ERR BIT DELAY >1 SEC? HALT ;NO. L402A: BICB #100,(R0) ;CLR RX INTENB MOVB 2(R0),R4 ;CLR HOLD JMP TST3 DATA: 125 ;SINGLE CHARACTER TRANSMISSION TEST(TST3) ;USES 'HOLD' MODE(NEXT SYMBOL) AND ALSO COMPLEMENTS ;THE DATA SENT TST3: MOV T3LCNT,LPCTR ;SET UP LOOP CTR MOV TXDAT,R3 ;SET UP DATA BIT K200,(R2) ;TX RDY SET? BNE L203 HALT ;NO. WHY? L203: TST (R0) ;RX CSR CLR? BEQ L303 HALT ;NO. WHY? L303: MOVB #4,(R0) ;SET HOLD BIT MOV R3,2(R2) ;SEND DATA L403: TSTB (R2) BPL L403 ;WAIT FOR TX RDY TST (R2) BPL L503 ;ERR BIT SET? HALT ;YES. WHY? L503: TSTB (R0) BPL L503 ;WAIT FOR RX RDY MOV 2(R0),TEMP ;READ RX DATA .IFDF BIT9 CMP R3,TEMP ;TX DATA=RX DATA? .ENDC .IFNDF BIT9 CMPB R3,TEMP .ENDC BEQ L603 HALT ;NO L603: CMP K200,(R0) ;RX RDY STILL SET AND BEQ L703 ;HOLD NOW CLR? HALT ;NO. WHY? L703: MOV 2(R0),TEMP ;READ RX DATA .IFDF BIT9 CMP R3,TEMP ;DATA STILL OK? .ENDC .IFNDF BIT9 CMPB R3,TEMP .ENDC BEQ L803 HALT ;NO L803: COM R3 ;COMPLEMENT DATA BIC #177400,R3 ;CLR UPPER BITS DEC LPCTR BNE L203 ;END OF LOOP? JMP TST4 ;YES TXDAT: 125 K200: 200 T3LCNT: 177777 LPCTR: 0 SETDEL: 177000 ;RETRANSMIT TEST(TST4) ;ISSUES RX RESET, WAITS, THEN TRANSMITS DATA AND ;FORCES THE ERR BIT SET. RETRANSMITS USING DIFFERENT DATA ;AND CHECKS THAT ORIGINAL DATA RECEIVED. TST4: MOV TXDAT,R3 BIS #2,(R0) ;RESET RX MOV SETDEL,TEMP ;SET UP DELAY MOV #1,DEL JSR PC,DELAY ;WAIT MOV R3,2(R2) ;SEND DATA AND FORCE ERR L104: TSTB (R2) BPL L104 ;WAIT FOR TX RDY TST (R2) BMI L204 ;ERR BIT SET? HALT ;NO. WHY? L204: TST (R0) BEQ L304 ;RX CSR CLR? HALT ;NO. WHY? L304: COM R3 ;COMPLEMENT DATA MOV R3,2(R2) ;RETRANSMIT L404: TSTB (R2) BPL L404 ;WAIT FOR TX RDY TST (R2) BPL L504 ;ERR BIT CLR? HALT ;NO. WHY? L504: TSTB (R0) BPL L504 ;WAIT FOR RX RDY COM R3 ;COMP FOR COMPARISON MOV 2(R0),TEMP ;READ RX DATA .IFDF BIT9 CMP R3,TEMP ;1ST DATA SENT=DATA RECEIVED? .ENDC .IFNDF BIT9 CMPB R3,TEMP .ENDC BEQ L604 HALT ;NO. WHY? L604: JMP TST5 ;DELAY SUBROUTINE. ;CALLING REQUIRES PRESETTING A REG(TEMP) AND A LOC 'DEL'. ;USES A LINKAGE REG(RET). VALUE IN DEL IS THE NUMBER OF ;MULTIPLES OF 200MS(188MS IF NO MEMORY MANAGEMENT) REQD. DELAY: BR L1DEL L1DEL: INC TEMP BNE L1DEL DEC DEL BNE L1DEL RTS PC DEL: 1 ;TIMER SUBROUTINE USED WITH TX ;CALLING REQUIRES USE OF A REG(TEMP), A LINKAGE ;REG(RET) AND PRESETTING OF LOC 'TIMLIM'. BECAUSE OF THE ;SIMILARITY OF THE MAIN TIMING LOOP TO THAT IN THE DELAY ;SUBROUTINE THE VALUE OBTAINED FROM 'TIM' COULD BE ;MODIFIED,IF NECESSARY, AND SUBSTITUTED IN 'DEL' OF ;THE DELAY SUBRTN. TIMER: CLR TEMP CLR TIM L2TIM: BITB #200,(R2) ;RDY SET? BEQ L1TIM RTS PC ;YES. RETURN L1TIM: INC TEMP ;NO. MAIN LOOP BNE L1TIM INC TIM CMP TIMLIM,TIM BNE L2TIM ;WAIT ANY LONGER? HALT ;NO TIM: 0 TIMLIM: 1 ;INCREMENT AND COMPLEMENT DATA TEST(TST5) ;ALL 9-BIT(512) OR 8-BIT(256) POSSIBILITIES OF DATA ;TESTED USING THE FOLLOWING PATTERN ;000,111,001,110,010,101 ETC TST5: MOV T5LCNT,LPCTR ;SET UP LOOP CTR L105: MOV #0,R3 ;DATA REG(R3)=0 CLR FLAG ;RESET FLAG TST (R0) ;RX CSR CLR? BEQ L205 HALT ;NO. WHY? L205: TSTB (R2) ;TX RDY? BMI L305 HALT ;NO. WHY? L305: MOV R3,2(R2) ;SEND DATA L405: TST (R2) BEQ L405 ;WAIT FOR TX RDY OR ERR BPL L505 HALT ;ERR BIT SET! L505: CMP #200,(R2) ;TX RDY SET ALL OTHERS CLR? BEQ L605 HALT ;NO L605: TSTB (R0) BPL L605 ;WAIT FOR RX RDY MOV 2(R0),TEMP ;READ RX DATA .IFDF BIT9 CMP R3,TEMP ;DATA SENT =DATA RECEIVED? .ENDC .IFNDF BIT9 CMPB R3,TEMP .ENDC BEQ L705 HALT ;NO L705: TST (R0) ;RX CSR CLR? BEQ L805 HALT ;NO L805: COM R3 ;COMPLEMENT DATA .IFDF BIT9 BIC #177000,R3 ;MASK OFF .ENDC .IFNDF BIT9 BIC #177400,R3 ;MASK OFF .ENDC COM FLAG ;COMPLEMENT FLAG BMI L305 ;FLAG SET? INC R3 ;NO .IFDF BIT9 CMP #400,R3 ;DATA=256? .ENDC .IFNDF BIT9 CMP #200,R3 ;DATA=128? .ENDC BNE L305 DEC LPCTR ;YES BNE L105 ;END OF LOOP? JMP TST6 ;YES T5LCNT: 500 FLAG: 0 ;UP-THE-SPOUT INCREMENT DATA TEST(TST6) ;TRANSMITS TWO CHARACTERS BEFORE READING THE FIRST SO ;THAT EACH TIME A CHARACTER IS RECEIVED AND READ ;ANOTHER FOLLOWS IMMEDIATELY. TST6: MOV T6LCNT,LPCTR ;SET UP LOOP CTR TST6A: MOV #0,R3 ;DATA(R3)=0 TST (R2) ;CHECK TX STATUS BPL L106 HALT ;ERR BIT SET! L106: CMP #200,(R2) ;TX RDY SET OTHER BITS CLR? BEQ L206 HALT ;NO L206: TST (R0) ;RX CSR CLR? BEQ L306 HALT ;NO L306: MOV R3,2(R2) ;SEND DATA MOV R3,SAV1 ;SAVE DATA SENT(SAV1) L406: INC R3 ;INCREMENT DATA(R3) L506: TST (R2) ;WAIT FOR TX RDY OR ERR BEQ L506 BPL L606 HALT ;ERR BIT SET L606: CMP #200,(R2) ;TX RDY SET OTHER BITS CLR? BEQ L706 HALT ;NO L706: MOV R3,2(R2) ;SEND DATA MOV R3,SAV2 ;SAVE DATA SENT(SAV2) L806: TSTB (R0) BPL L806 ;WAIT FOR RX RDY CMP #200,(R0) ;RX RDY SET OTHER BITS CLR? BEQ L906 HALT ;NO L906: MOV 2(R0),TEMP ;READ RX DATA .IFDF BIT9 CMP SAV1,TEMP ;TX DATA=RX DATA? .ENDC .IFNDF BIT9 CMPB SAV1,TEMP .ENDC BEQ L1006 HALT ;NO .IFDF BIT9 L1006: CMP #777,SAV2 ;LAST CHAR? .ENDC .IFNDF BIT9 L1006: CMP #377,SAV2 ;LAST CHAR.? .ENDC BEQ L1206 MOV SAV2,SAV1 ;NO. SAV1:-SAV2 BR L406 L1206: TSTB (R0) BPL L1206 ;WAIT FOR RX RDY. MOV 2(R0),TEMP ;READ RX DATA .IFDF BIT9 CMP SAV2,TEMP ;CHK. LAST CHAR. .ENDC .IFNDF BIT9 CMPB SAV2,TEMP .ENDC BEQ L1306 HALT ;DATA ERROR L1306: DEC LPCTR BNE TST6A ;END OF LOOP? JMP TST7 ;YES T6LCNT: 500 SAV1: 0 SAV2: 0 ;INTERRUPT TEST(TST7) ;USES A DECREMENTING DATA PATTERN WHICH IS CHECKED ON ;A CHARACTER BY CHARACTER BASIS TST7: MOV T7LCNT,LPCTR ;SET UP LOOP CTR MOV #T7RINT,@#RXVLOC ;SET-UP RX VECTOR MOV #INTOFF,@#RXVPSW ;PRIORITY LEVEL MOV #T7TINT,@#TXVLOC ;SET UP TX VECTOR MOV #INTOFF,@#TXVPSW ;PRIORITY LEVEL BICB #100,(R0) ;CLR RX INTENB BICB #100,(R2) ;CLR TX INTENB TSTB (R0) ;RX STATUS=0? BEQ L107 HALT ;NO L107: TST (R2) ;CHECK TX STATUS BPL L207 HALT ;TX ERR SET L207: CMP #200,(R2) ;TX RDY SET,INTENB CLR? BEQ TST7A HALT ;NO TST7A: CLR END7 ;CLR END MOV T7DAT,R3 ;TX DATA IN R3 MOV T7DAT,R1 ;RX COMPARISON DATA IN R1 CLR TXICTR ;CLR TX INT CTR CLR RXICTR ;CLR RX INT CTR BIS #100,(R0) ;SET RX INTENB BIS #100,(R2) ;SET TX INTENB MOV R3,2(R2) ;SEND DATA MOV #INTON,@#PS ;INTERRUPTS ON TST7B: CMP #2,END7 ;END=2? IF NOT THEN WAIT BNE TST7B L107B: CMP INTCNT,TXICTR ;TXICTR=512 OR 256? BEQ L207B HALT ;NO L207B: CMP INTCNT,RXICTR ;RXICTR=512 OR 256? BEQ L307B HALT ;NO L307B: MOV #INTOFF,@#PS ;INTERRUPTS OFF DEC LPCTR ;DECREMENT LOOP CTR BNE TST7A ;END OF LOOP? JMP PASEND ;YES ;TX INTERRUPT HANDLER T7TINT: BIC #100,(R2) ;CLR TX INTENB INC TXICTR TST (R2) BPL L107T HALT ;TX ERR SET! L107T: CMP #200,(R2) ;TX RDY SET,INTENB CLR? BEQ L207T HALT ;NO L207T: TST R3 ;TX DATA=0? BNE L307T INC END7 ;YES BR L407T L307T: DEC R3 ;NO. DEC TX DATA MOV R3,2(R2) ;SEND DATA BIS #100,(R2) ;SET TX INTENB L407T: RTI ;RETURN FROM INTERRUPT ;RX INTERRUPT HANDLER T7RINT: BIC #100,(R0) ;CLR RX INTENB INC RXICTR CMP #200,(R0) ;RX RDY SET,OTHERS CLR? BEQ L107R HALT ;NO L107R: MOV 2(R0),TEMP ;READ RX DATA .IFDF BIT9 CMP R1,TEMP ;RX DATA OK? .ENDC .IFNDF BIT9 CMPB R1,TEMP .ENDC BEQ L207R HALT ;NO L207R: TST R1 ;END OF DATA? BNE L307R INC END7 ;YES BR L407R L307R: DEC R1 ;DEC EXPECTED DATA BIS #100,(R0) ;SET RX INTENB L407R: RTI .IFDF BIT9 T7DAT: 777 ;ASS. IF 9-BIT .ENDC .IFNDF BIT9 T7DAT: 377 ;ASS. IF 8-BIT .ENDC .IFDF BIT9 INTCNT: 1000 ;ASS. IF 9-BIT .ENDC .IFNDF BIT9 INTCNT: 400 ;ASS. IF 8-BIT .ENDC END7: 0 TXICTR: 0 RXICTR: 0 T7LCNT: 500 ;ERROR TRAPS HLT0: 0 ;VECTOR ADDRESS 0(RESERVED LOC.) HLT4: 0 ; " " 4(CPU ERRORS) HLT10: 0 ; " " 10(ILL. OR RESERV. INSTR.) HLT20: 0 ; " " 20(I/O TRAP) .IFNDF PRAV ;ASS. IF PRINTER NOT AVAIL. PASEND: DEC PLCTR ;DEC. MAIN CTR BEQ ENDPAS ;LAST PASS? JMP MLPENT ;NO ENDPAS: HALT ;PRESS CONT. TO RUN AGAIN JMP BGN PLCNT: 24 ;MAIN PROGRAM LOOP COUNT PLCTR: 0 .ENDC ;******************** .IFDF PRAV ;ASS. IF PRINTER AVAIL. PASEND: MOV #PRADRS,R2 ;PRINTER CSR ADDRESS IN R2 JSR PC,PRDY ;PRINTER RDY? MOV #'*,2(R2) ;PRINT *(END OF PASS) DEC CCTR ;END OF LINE? BNE L1EPAS MOV LLNGTH,CCTR ;YES. PRESET CHAR. CTR MOV #CRLF,MSGPTR JSR PC,PRINT ;PRINT CR/LF JSR PC,NULLS ;PRINT NULLS L1EPAS: DEC PLCTR BEQ L2EPAS ;LAST PASS? JMP MLPENT ;NO L2EPAS: MOV #CRLF,MSGPTR JSR PC,PRINT ;PRINT CR/LF JSR PC,NULLS MOV #END,MSGPTR JSR PC,PRINT ;PRINT 'END' HALT ;PRESS CONT. TO RUN AGAIN JMP BGN LLNGTH: 24 ;SET NUMBER OF '*' PER LINE CCTR: 0 PLCNT: 24 ;MAIN PROG. LOOP COUNT PLCTR: 0 NULLS: MOVB #3,TEMP ;SET NUMBER OF NULLS NLL: JSR PC,PRDY CLRB 2(R2) ;PRINT NULL DEC TEMP BNE NLL RTS PC ;WAIT FOR PRINTER RDY PRDY: TSTB (R2) ;PRINTER RDY? BPL PRDY RTS PC ;YES ;CARRIAGE RETURN LINE FEED TEXT CRLF: .BYTE 15,12,0 .EVEN ;END OF PROGRAM TEXT END: .ASCII /END/ .BYTE 15,12,0 .EVEN ;SUBRTN. FOR PRINTING CHAR. STRINGS PRINT: JSR PC,PRDY ;WAIT UNTIL PRINTER RDY MOVB (MSGPTR)+,2(R2);PRINT TSTB (MSGPTR) ;LAST CHAR? BNE PRINT ;NO RTS PC .ENDC ******************** .END