***************************************************************** * * * (c) Copyright Hewlett-Packard Company, 1987. * * All rights are reserved. Copying or other * * reproduction of this program except for archival * * purposes is prohibited without the prior * * written consent of Hewlett-Packard Company. * * * * RESTRICTED RIGHTS LEGEND * * * * Use, duplication, or disclosure by the Government * * is subject to restrictions as set forth in * * paragraph (b) (3) (B) of the Rights in Technical * * Data and Computer Software clause in * * DAR 7-104.9(a). * * * * HEWLETT-PACKARD COMPANY * * Fort Collins, Colorado * * * ***************************************************************** * * * SOURCE TEXT FOR HP 9000, SERIES 300 COMPUTER TEST CODE. * * * * MODULE NAME: PTMTST * * * * TODAYS EDIT: 1988/AUG/03 10:50 * * * * *DAD* CHANGED RTS TO JMP EXECUTEPGM TO MAKE IT A TST * * * ***************************************************************** * PAGE * NOSYMS LLEN 120 SPRINT * ******************************** * * * EXTERNAL REFERENCES * * * ******************************** * REFR ERROR,MESSAGE,REALTIME REFR INITBUSER,FILL_VCTR REFR EXECUTEPGM,ICACHEOFF * LMODE ERROR,MESSAGE,REALTIME LMODE INITBUSER,FILL_VCTR LMODE EXECUTEPGM,ICACHEOFF * REFA LVL6INT,CODEFLAG * ******************************** * * * ENTRY POINT IN THIS TEXT * * * ******************************** * DEF PTMTST * PAGE * ******************************** * * * EQUATES USED BY THIS TEST * * * ******************************** * PTM EQU $5F8000 CACHE CONTROL REGISTER REG0 EQU 1 REGISTER 0 REG1 EQU 3 REGISTER 1 REG2 EQU 5 REGISTER 2 REG3 EQU 7 REGISTER 3 REG4 EQU 9 REGISTER 4 REG5 EQU 11 REGISTER 5 REG6 EQU 13 REGISTER 6 REG7 EQU 15 REGISTER 7 * * COMMANDS CNTROUTEN EQU $80 COUNTER OUTPUT ENABLE INTENABLE EQU $40 INTERRUPT ENABLE NORMAL16 EQU $00 NORMAL 16 BIT MODE DUAL8 EQU $04 DUAL 8 BIT MODE EXTCLOCK EQU $00 EXTERNAL CLOCK ENABLCLOX EQU $02 ENABLE CLOCK PRESET EQU $01 PRESET (CR10) CR_1 EQU $01 SELECT CNTR 1 (CR20) CR_3 EQU $00 SELECT CNTR 3 (CR20) CR_3DIV8 EQU $01 COUNTER 3 / 8 * * CRX3, CRX4 & CRX5 SINGLE EQU $08 SINGLE SHOT MODE CONTMODE EQU $00 CONTINUOUS MODE * * STATUS REGISTERD I1 EQU $01 COUNTER 1 INTERRUPT I2 EQU $02 COUNTER 2 INTERRUPT I3 EQU $04 COUNTER 3 INTERRUPT INTERRUPT EQU $80 OVERALL INTERRUPT * JUMPLONG EQU $4EF9 JUMP LONG INSTRUCTION * RORG 0 * PAGE * ******************************** * * * PTM RESET TEST * * * ******************************** * * PTM IS MEMORY($5F8000). ** ODD BYTE ARRAY[1..15] * REG0 IS 1 * REG1 IS 3 * CR_1 IS 1 * STATUS IS D0.BYTE * DATA IS D1.BYTE * EXPECTED IS D2.BYTE * COMMAND IS D4.BYTE * BUS_ERROR IS D5.BYTE * NOPTM IS FORMAT.FORWARD * PTMSTMSG IS FORMAT.FORWARD * INITBUSER IS SUBROUTINE.EXTERNAL * ERROR IS SUBROUTINE.EXTERNAL * MESSAGE IS SUBROUTINE.EXTERNAL * * PTMTST: * CALL INITBUSER * DATA = PTM(REG0) * IF BUS_ERROR THEN CALL ERROR(NOPTM); ** GOTO ENDOFTEST.. * COMMAND = CR_1 * PTM(REG1) = COMMAND * COMMAND = PRESET * PTM(REG0) = COMMAND; !HOLD PRESET!.. * EXPECTED = 0 * CALL CHK_STAT(RSTMSG,EXPECTED); * ******************************** * PTMTST JSR INITBUSER INITIALIZE BUS ERROR LEA PTM+REG0,A0 POINTER TO PTM MOVE.B (A0),D1 READ DATA NOP * TST.B D5 CHECK FOR BUS ERROR BEQ.S PTMHERE * JSR ERROR REPORT ERROR DC.W NOPTM-* * BRA ENDOFTEST ABORT PTMHERE JSR ICACHEOFF TURN ICACHE OFF LEA PTM+REG1,A1 POINTER TO PTM MOVEQ #CR_1,D4 SET CR20 MOVE.B D4,(A1) WRITE COMMAND * MOVEQ #CR10T,D4 SET CR10 - HOLD RESET MOVE.B D4,(A0) WRITE COMMAND MOVEQ #0,D2 EXPECTED STATUS NOP NOP NOP NOP NOP BSR CHK_STAT CHECK STATUS DC.W RSTMSG-* * PTMSTOK1 EQU * PAGE * ******************************** * * * PTM LATCHES & COUNTER * * INITIALIZATION * * * ******************************** * * REG2 IS 5 * REG6 IS 13 * TIMERNO IS D3.WORD * CHK_DATA IS SUBROUTINE(<>TIME).EXTERNAL * COUNTMSG IS FORMAT.FORWARD * NOPTMSPD IS FORMAT.FORWARD * * PTM(REG1) = CR_1 * PTM(REG0) = PRESET * PTM(REG2) = $FFFF * CALL REALTIME(TIME) * OLDTIME = TIME * FOR TIMEOUT = 1200 TO 0 BY -1 * CALL REALTIME(TIME) * IF OLDTIME # TIME THEN GOTO SYNC * NEXT TIMEOUT * CALL ERROR(NOPTMSPD); GOTO ENDOFTEST * SYNC: * OLDTIME = TIME * PTM(REG0) = CONTMODE * REPEAT * CALL REALTIME(TIME) * UNTIL OLDTIME # TIMEP * DATA = PTM(REG2) * IF DATA > -2250 OR DATA < 2750 THEN ** CALL ERROR(COUNTMSG,DATA) * ******************************** * MOVE.B #CR_1,(A1) PRESET MOVE.B #PRESET,(A0) * MOVEQ #-1,D2 COUNT VALUE MOVEP.W D2,REG2(A2) * JSR REALTIME GET KBD REAL TIME MOVE.B D3,D7 SAVE MOVE.W #1200,D6 INITIAL TIMEOUT COUNTL1 JSR REALTIME GET KBD REAL TIME CMP.B D3,D7 CHECK FOR CHANGE BNE.S SYNC * SUBQ.W #1,D6 LOOP BGE COUNTL1 * JSR ERROR REPORT TIMEOUT ERROR DC.W NOPTMSPD-* * BRA ENDOFTEST ABORT TEST SYNC MOVE.B D3,D7 SAVE KBD TIME ADDQ.B #8,D7 100ms ADDQ.B #2,D7 * MOVE.B #CONTMODE,(A0) WRITE COMMAND TO START COUNTL2 JSR REALTIME GET KBD REAL TIME CMP.B D3,D7 CHECK FOR CHANGE BNE COUNTL2 LOOP MOVEP.W REG2(A2),D1 GET DATA * ACTUAL LIMIT IS 9000 TO 11000 us MOVE.W #-24064,D7 EXPECTED LIMITS MOVE.W #-25856,D3 * CMP.W D7,D1 CHECK RESULTS BLE.S TRYLOWER * COUNTERR JSR ERROR * REPORT ERROR DC.W COUNTMSG-* * BRA.S CR1OK1 * TRYLOWER CMP.W D3,D1 CHECK RESULTS BLT COUNTERR * * JSR MESSAGE ****** * DC.W PTMCNT-* ****** CR1OK1 EQU * * PAGE * ******************************** * * * PTM COUNTER 3 RATE * * * ******************************** * * CR_3DIV8 IS $01 * DUAL8 IS $04 * FLAGS IS D6.LONG * VALUE IS D7.WORD * CR3ERR IS FORMAT.FORWARD * * PTM(REG0) = PRESET * PTM(REG6) = $FFFF * PTM(REG1) = CR_3 * PTM(REG0) = CONTMODE * PTM(REG1) = CR_1 * PTM(REG0) = CONTMODE * WAIT(127) * DATA = PTM(REG6) * VALUE = PTM(REG2) * DATA = VALUE - DATA * IF DATA < 0 OR DATA > 2 THEN ** CALL ERROR(CR3ERR,DATA).. * PTM(REG0) = PRESET * PTM(REG6) = $FFFF * PTM(REG1) = CR_3 * PTM(REG0) = CONTMODE + CR_3DIV8 * PTM(REG1) = CR_1 * PTM(REG0) = CONTMODE * WAIT(127) * VALUE = PTM(REG2) * DATA = PTM(REG6) * VALUE = VALUE / 8 - DATA * IF DATA = 0 THEN GOTO CR3OK3 * IF ABS(DATA) - 1 = 0 THEN GOTO CR3OK3 * CALL ERROR(CR3ERR,DATA) * CR3OK3: * PTM(REG0) = PRESET * PTM(REG6) = $0007 * PTM(REG1) = CR_3 * PTM(REG0) = CONTMODE + CR_3DIV8 * PTM(REG1) = CR_1 * PTM(REG0) = CONTMODE * FOR TIMEOUT = 127 TO 1 BY -1 * VALUE = PTM(REG6) * IF VALUE < 7 THEN GOTO CR3CNTL5 * NEXT TIMEOUT * GOTO CR3CNTL6 * CR3CNTL5: * FOR TIMEOUT = TIMEOUT TO 1 BY -1 * VALUE = PTM(REG6) * IF VALUE > 7 THEN GOTO CR3CNT6 * BITSET(VALUE,FLAGS) * IF FLAGS = $FF THEN GOTO CR3CNTL7 * NEXT TIMEOUT * CR3CNTL6: * CALL ERROR(CRPRESET,FLAGS,3) * CR3CNTL7: * PTM(REG0) = PRESET * PTM(REG6) = $0107 * PTM(REG1) = CR_3 * PTM(REG0) = CONTMODE + CR_3DIV8 + DUAL8 * PTM(REG1) = CR_1 * PTM(REG0) = CONTMODE * FOR TIMEOUT = 127 TO 1 BY -1 * VALUE = PTM(REG6) * IF VALUE AND $F0F0 THEN GOTO CR3CNTL9 * VALUE = (VALUE.BYTE * 8 + VALUE.WORD AND ** $0F00) / 8.. * BITSET(VALUE,FLAGS) * NEXT TIMEOUT * IF FLAGS <> $00FF00FF THEN ** CR3CNTL9: CALL ERROR(DUAL8MSG,FLAGS, ** VALUE,TIMEOUT).. * ******************************** * MOVE.B #PRESET,(A0) PRESET MOVEQ #-1,D2 INITIAL VALUE MOVEP.W D2,REG6(A2) * MOVE.B #CR_3,(A1) SELECT CR3 MOVE.B #CONTMODE,(A0) COMMAND FOR CONTINUOUS MODE MOVE.B #CR_1,(A1) SELECT CR1 MOVE.B #CONTMODE,(A0) COMMAND FOR CONTINUOUS MODE MOVE.W #512,D6 WAIT CR3CNTL1 SUBQ.W #1,D6 * BGT CR3CNTL1 LOOP MOVEP.W REG6(A2),D1 GET COUNT MOVEP.W REG2(A2),D7 * MOVE.W D1,D6 SUB.W D7,D1 CHECK RESULTS ADDQ.W #1,D1 * BGE.S CR3OK1 * CR3NOK SUBQ.W #1,D1 * REPAIR JSR ERROR * REPORT ERROR DC.W CR3ERR-* * BRA.S CR3OK2 * CR3OK1 CMPI.W #3,D1 * BGT CR3NOK * REPORT ERROR CR3OK2 MOVE.B #PRESET,(A0) PRESET MOVEQ #-1,D2 INITIAL VALUE MOVEP.W D2,REG6(A2) * MOVE.B #CR_3,(A1) SELECT CR3 MOVE.B #CONTMODE+CR_3DIV8,(A0) COMMAND FOR CONTINUOUS MODE MOVE.B #CR_1,(A1) SELECT CR1 MOVE.B #CONTMODE,(A0) COMMAND FOR CONTINUOUS MODE MOVE.W #-283,D6 WAIT LOOP VALUE CR3CNTL2 MOVEP.W REG2(A2),D7 * CMP.W D6,D7 WAIT FOR -283 BGT CR3CNTL2 LOOP MOVEP.W REG6(A2),D1 GET COUNT ASR.W #3,D7 DIVIDE BY 8 SUB.W D1,D7 CHECK RESULTS BEQ.S CR3OK3 * BPL.S CR3CNTL3 * NOT.W D7 * CR3CNTL3 CMPI.W #1,D7 * BEQ.S CR3OK3 * MOVE.W D7,D1 * JSR ERROR * REPORT ERROR DC.W CR3ERR-* * CR3OK3 EQU * MOVE.B #PRESET,(A0) PRESET MOVEQ #7,D2 INITIAL VALUE MOVEP.W D2,REG6(A2) * MOVE.B #CR_3,(A1) SELECT CR3 MOVE.B #CONTMODE+CR_3DIV8,(A0) COMMAND FOR CONTINUOUS MODE MOVE.B #CR_1,(A1) SELECT CR1 MOVE.B #CONTMODE,(A0) COMMAND FOR CONTINUOUS MODE CLR.B D1 CLEAR FLAGS MOVEQ #127,D6 LOOP COUNT CR3CNTL4 MOVEP.W REG6(A2),D7 WAIT FOR COUNT DOWN FROM PRESET CMPI.W #7,D7 * BLT.S CR3CNTL5 * SUBQ.L #1,D6 * LOOP BGT CR3CNTL4 * * BRA.S CR3CNTL6 ABORT CR3CNTL5 MOVEP.W REG6(A2),D7 GET DATA CMPI.W #7,D7 CHECK FOR OUT OF RANGE BHI.S CR3CNTL6 * BSET D7,D1 SET A FLAG CMPI.B #$FF,D1 CHECK FOR ALL FLAGS SET BEQ.S CR3CNTL7 * SUBQ.L #1,D6 LOOP BGT CR3CNTL5 * CR3CNTL6 MOVEQ #3,D4 CR# JSR ERROR REPORT ERROR DC.W CRPRESET-* * CR3CNTL7 MOVE.B #PRESET,(A0) PRESET MOVE.W #$0107,D2 INITIAL VALUE MOVEP.W D2,REG6(A2) * MOVE.B #CR_3,(A1) SELECT CR3 MOVE.B #CONTMODE+CR_3DIV8+DUAL8,(A0) COMMAND FOR CONTINUOUS MODE MOVE.B #CR_1,(A1) SELECT CR1 MOVE.B #CONTMODE,(A0) COMMAND FOR CONTINUOUS MODE CLR.L D1 CLEAR FLAGS MOVEQ #127,D6 LOOP COUNT CR3CNTL8 MOVEP.W REG6(A2),D7 GET DATA MOVE.W D7,D5 CHECK FOR ILLEGAL VALUES ANDI.W #$F0F0,D5 * BNE.S CR3CNTL9 * LSL.B #4,D7 COMBINE LSR.W #4,D7 * BSET D7,D1 SET FLAG SUBQ.L #1,D6 LOOP BGT CR3CNTL8 * CMPI.L #$00FF00FF,D1 CHECK RESULTS BEQ.S CR3CNTL10 * CR3CNTL9 JSR ERROR REPORT ERROR DC.W DUAL8MSG-* * CR3CNTL10 EQU * * PAGE * ******************************** * * * PTM COUNTER 2 RATE * * * ******************************** * * PTM(REG0) = PRESET * PTM(REG4) = $0007 * PTM(REG1) = CR_3 * PTM(REG0) = CONTMODE + DUAL8 + CNTROUTEN * PTM(REG1) = CR_1 + CONTMODE * PTM(REG0) = CONTMODE * FOR TIMEOUT = 127 TO 1 BY -1 * VALUE = PTM(REG4) * IF VALUE < 7 THEN GOTO CR2CNTL2 * NEXT TIMEOUT * GOTO CR2CNTL3 * CR2CNTL2: * FOR TIMEOUT = TIMEOUT TO 1 BY -1 * VALUE = PTM(REG4) * IF VALUE > 7 THEN GOTO CR2CNT3 * BITSET(VALUE,FLAGS) * IF FLAGS = $FF THEN GOTO CR2CNTL4 * NEXT TIMEOUT * CR2CNTL3: * CALL ERROR(CRPRESET,FLAGS,2) * CR2CNTL4: * ******************************** * MOVE.B #PRESET,(A0) PRESET MOVEQ #7,D2 INITIAL VALUE MOVEP.W D2,REG4(A2) * MOVE.B #CR_3,(A1) SELECT CR3 MOVE.B #CONTMODE+CNTROUTEN+DUAL8,(A0) COMMAND FOR CONTINUOUS MODE MOVE.B #CR_1,(A1) SELECT CR1 MOVE.B #CONTMODE,(A0) COMMAND FOR CONTINUOUS MODE CLR.B D1 CLEAR FLAGS MOVEQ #127,D6 LOOP COUNT CR2CNTL1 MOVEP.W REG4(A2),D7 WAIT FOR COUNT DOWN FROM PRESET CMPI.W #7,D7 * BLT.S CR2CNTL2 * SUBQ.L #1,D6 * LOOP BGT CR2CNTL1 * * BRA.S CR2CNTL3 ABORT CR2CNTL2 MOVEP.W REG4(A2),D7 GET DATA CMPI.W #7,D7 CHECK FOR OUT OF RANGE BHI.S CR2CNTL3 * BSET D7,D1 SET A FLAG CMPI.B #$FF,D1 CHECK FOR ALL FLAGS SET BEQ.S CR2CNTL4 * SUBQ.L #1,D6 LOOP BGT CR2CNTL2 * CR2CNTL3 MOVEQ #2,D4 CR# JSR ERROR REPORT ERROR DC.W CRPRESET-* * CR2CNTL4 EQU * * ******************************** * * * END OF PTM TEST * * * ******************************** * * ENDOFTEST: * RETURN * ******************************** * ENDOFTEST JMP EXECUTEPGM END OF TEST * PAGE * ******************************** * * * READ AND CHECK DATA * * * ******************************** * * REG_NO IS D3.WORD * * CHK_DATA: * DATA.WORD = PTM(REG_NO) * IF DATA # EXPECTED THEN ** CALL ERROR(DATAER,DATA,EXPECTED).. * RETURN * ******************************** * CHK_DATA LEA -REG0(A0,D3.W),A2 POINTER MOVEP.W 0(A2),D1 READ DATA CMP.W D2,D1 CHECK RESULTS BEQ.S CHK_DATOK * JSR ERROR REPORT ERROR DC.W DATAER-* * CHK_DATOK RTS RETURN * * ******************************** * * * READ AND CHECK STATUS * * * ******************************** * * ENTER WITH: D2 = EXPECTED STATUS * RETURN = OFFSET TO MESSAGE * EXIT TO: RETURN + 2 * * CHK_STAT: * STATUS = PTM(REG1) * IF STATUS # EXPECTED THEN ** CALL MESSAGE(PTMSTMSG,STATUS,EXPECTED) ** GOTO ERROR.. * RETURN(+2) * ******************************** * CHK_STAT MOVE.B (A1),D0 READ DATA CMP.B D2,D0 CHECK RESULTS BEQ.S CHK_STOK * JSR MESSAGE REPORT ERROR DC.W PTMSTMSG-* * JMP ERROR * FINISH ERROR & DO RETURN CHK_STOK ADDQ.L #2,(A7) SKIP OVER MESSAGE RTS RETURN * PAGE * ******************************** * * * PTM INTERRUPT SERVICE * * SUBROUTINE * * * ******************************** * * ENTER WITH: INTERRUPT ON LEVEL 6 * EXIT WITH: INTERRUPTS DISABLED AND * INTERRUPT FLAG SET IN D6 * * SP IS A7.LONG * MEMORY IS ARRAY.ANY * * PTMINT: * INT_FLAG = 1 * MEMORY(SP).WORD = MEMORY(SP).WORD OR $0700 * EXCEPTION RETURN * ******************************** * PTMINTSVC MOVEQ #1,D6 SET INTERRUPT FLAG ORI.W #$0700,(A7) DISABLE INTERRUPTS RTE RETURN * ******************************** * * * FORMATs FOR OUTPUT * * * ******************************** * NOPTM DC.B 'PTM BUS ERROR @ 5F8001',$8D PTMSTMSG DC.B 'PTM status is ',$90,' not ' DC.B $92,' after ',$80 RSTMSG DC.B 'Reset',$8D CLRINTMSG DC.B 'clear int',$8D CMDMSG DC.B 'command ',$94,$8D DATAER DC.B 'PTM reg',$D3,' is ',$A1 DC.B ' not ',$A2,$8D COUNTMSG DC.B 'PTM CR1 went ' DC.B 'from FFFF to ',$A1 DC.B ' (',$A3,',',$A7,') in .1s',$8D * PTMCNT DC.B 'In 10ms PTM CR1 went ' * DC.B 'from FFFF to ',$A1,$8D CR3ERR DC.B 'PTM CR3 speed error ',$A1 DC.B ' (0-2)',$8D CRPRESET DC.B 'PTM CR',$D4,' values 0-7, ' DC.B 'Preset ',$91,$8D DUAL8MSG DC.B 'PTM Dual-8 CR3 ',$B1,', ' DC.B $A7,', ',$96,$8D NOPTMSPD DC.B 'No PTM speed - KBD bad?',$8D NOINTMSG DC.B 'PTM did not int',$8D BADINT DC.B 'PTM int unexpected',$8D * END PTM Bus Error @ 5F8001 PTM status is XX not YY after Reset PTM status is XX not YY after clear int PTM status is XX not YY after command ZZ PTM regX is YYYY not ZZZZ PTM CR1 went from FFFF to XXXX (YYYY,ZZZZ) in .1s PTM CR3 speed error XXXX (0-2) PTM CRX values 0-7, Preset YY PTM Dual-8 CR3 XXXXXXXX, YYYY, ZZ PTM no speed - KBD bad? PTM did not int PTM int unexpected