************************************************** * * FROM INTEL MICROCOMPUTER USER'S LIBRARY, * REF. NO. 80-66 * ************************************************** * * MEMORY DIAGNOSTIC PROGRAM * ========================= * * * VERSION 3.0 (INTELLEC 8/MOD 80) * APRIL, 9.75 * * * LANDIS & GYR AG * CH - 6300 ZUG * SWITZERLAND * * * 1. ABSTRACT * -------- * WRITES TEST BYTES IN ANY RANGE OF MEMORY * AND COMPARES THE WRITTEN BIT COMBINATION * WITH WHAT IS READ. * UPON DETECTION OF A DEFECTIVE MEMORY * LOCATION, AN ERROR MESSAGE IS PRINTED * SPECIFYING THE ADDRESS, REFERENCE AND * ACTUAL VALUES. * * * 2. REQUIREMENTS * ------------ * * 2.1 EQUIPMENT: * --------- * - INTELLEC 8/MOD 80 SYSTEM * [8080 SYSTEM & HELIOS II] * - CONSOLE (TTY) * - PRINTER (TTY) * * 2.2 MEMORY: * ------ * - PROGRAMSIZE: 1ABH BYTES (<1/2K MEMORY) * - STACKSIZE : 14H BYTES * * 2.3 SUPPORTING SOFTWARE: * ------------------- * - INTELLEC 81 SYSTEM MONITOR * (LOADING AND STRATING) * [PTDOS OPERATING SYSTEM] * * 3. USE PROCEDURE * ------------- * * 1. LOAD HEX TAPE WITH SYSTEM MONITOR * [TYPE PROGRAM NAME INTO CI] * 2. START PROGRAM AT LOCATION 40H * [PROGRAM WILL AUTO EXECUTE] * 3. PROGRAM WILL PRINT TITLE AND VERSION * "MEMORY DIAGNOSTIC VERSION 3.0" * AND IS READY FOR ADDRESS RANGE INPUT * 4. SELECT MEMORY ARRAY TO BE TESTED * , * - DELIMITER BETWEEN VALUES = ',' * - CLOSING INPUT PARAMETERS WITH CR * 5. PROGRAM WILL PRINT TABLE TITLES * "ADDR: REF: ACT:" * AND IS RUNNING * 6. IF THERE IS A DEFECTIVE MEMORY LOCATION, * AN ERROR MESSAGE IS PRINTED * * 3.1 I/O FORMAT * ---------- * - INPUT/OUPTUT IN HEX * * 3.2 RESTART * ------- * - PROGRAM MAY BE RESTARTED WITH CTRL/C * FROM THE CONSOLE * * * * 4. SYMBOLS: * ------- * LIM1 EQU 2CH DELIMITER1 = ',' LIM2 EQU 0DH DELIMITER2 = CR BLANK EQU 20H BLANK (ASCII) BREAK EQU 3H BREAK CHARACTER FOR ESCAP EQU 1BH ESCAPE CHARACTER, BACK TO ? * RESTART (CRTL/C) * * MAIN * **** * ORG 0000H XEQ 0000H * * START LXI SP,FIN+30H SET STACK POINTER DI LXI H,STRG1 PRINT TITLE, VERSION CALL INIT MVI C,2 GET 2 PARAMETERS CALL VALUE GET ADDR.,SET CY IF JC START ...ILLEGAL CHARACTER LXI H,STRG2 PRINT TABLE-TITLES: CALL INIT ...ADDR,REF,ACT CALL DIFF H/L ADDR., SET CY IF JC START ...DIFF NEG => REINIT DIAG1 MVI B,0 INIT TESTWORD DIAG2 POP D SET CURRENT DIFF + ADDR POP H PUSH H DECREMENT SP PUSH D WRIT1 MOV M,B WRITE TESTCHARACTER CALL INCR SET Z FLAG IF DIFF = 0 JNZ WRIT1 POP D SET CURRENT DIFF + ADDR POP H PUSH H PUSH D READ1 MOV A,M READ TESTCHARACTER CMP B COMPARE READ. AND CNZ ERROR ...WRITE. TESTCHARACTER CALL INCR JNZ READ1 CALL BRKT TEST BREAK DIAG3 INR B INCREMENT TESTCHARACTER JNZ DIAG2 JMP EXTEN JUMP TO EXT. DIAGNOSTIC * * * INP * === * * GET CHARACTER FROM CONSOLE * CALLING SEQUENCE: CALL INP (MAIN) * * EXIT : A = CHARACTER * REGS NOT MODIFIED * F MODIFIED * * INP CALL CONIN ANI 7FH RET . * * * OUTP * ==== * * SEND CHARACTER OF CONSOLE * CALLING SEQUENCE: CALL OUTP (MAIN,ERROR) * * ENTRY: A = CHARACTER * EXIT : REGS NOT MODIFIED * F MODIFIED * * OUTP PUSH B CALL CONOUT OUTPUT CHARACTER POP B RET . * * * INIT * ==== * * TEXT STRING OUPTUT * CALLING SEQUENCE: CALL INIT (MAIN) * * ENTRY: HL = STRING ADDRESS * EXIT : A,HL,F MODIFIED * BC,DE NOT MODIFIED * * INIT MOV A,M FETCH CHARACTER ORA A END OF STRING? RZ INX H CALL OUTP OUTPUT CHARACTER JMP INIT * * * STRG1 * ===== * * TEXT STRING 1 * CONTENT: TITLE, VERSION * STRG1 DB 0DH,0AH,0AH,0AH,0AH,0AH,0AH,0AH,0AH DB 0AH,0AH,0AH,0AH,0AH,0AH,0AH,0AH ASC 'MEMORY DIAGNOSTIC VERSION 3.1 (MODIFIED FOR PTDOS)' DB 0DH,0AH ASC ',' DB 0DH,0AH,0AH,0 * * * STRG2 * ===== * * TEXT STRING 2 * CONTENT: TABLE TITLES * STRG2 DB 0DH,0AH ASC 'ADDR: REF: ACT:' DB 0DH,0AH,0 * * * * VALUE * ===== * * GET 16 BIT VALUE FROM CONSOLE * CHECKS IF DELIMITER BETWEEN VALUES = ',' * IF DELIMITER AFTER LAST VALUE = CR * CALLING SEQUENCE: CALL VALUE (MAIN) * * ENTRY: C = NUMBER OF VALUES * EXIT : STACK - HIGH ADDRESS * - LOW ADDRESS * F,REGS MODIFIED * * VALUE XTHL . SAVE RETURN ADDRESS XCHG . INX SP INX SP VAL5 LXI H,0 VAL0 CALL INP GET CHARACTER MOV B,A SAVE CHARACTER CALL OUTP ECHO CHARACTER MOV A,B RESTORE CHARACTER CALL HEXA TEST IF HEX JC VAL1 DAD H SHIFT 4 BIT LEFT DAD H DAD H DAD H ANI 0FH MASK 4 LSB ORA L MOV L,A JMP VAL0 * VAL1 DCR C JZ VAL3 LAST VALUE MOV A,B CPI LIM1 DELIMITER = ',' JNZ VAL4 ILLEGAL DELIMITER PUSH H SAVE VALUE JMP VAL5 GET ANOTHER CHARACTER * VAL3 MOV A,B CPI LIM2 DELIMITER = CR ? JNZ VAL4 ILLEGAL DELIMITER PUSH H SAVE LAST VALUE ORA A XCHG . GET RETURN ADDRESS PCHL . JUMP INDIRECT * VAL4 STC . ILLEG.CHAR, SET XCHG . GET RETURN ADDRESS PCHL . JUMP INDIRECT * * * HEXA * ==== * * CHECKS IF CHARACTER IN HEX * SETS CY IF CHARACTER NOT VALID * CALLING SEQUENCE: CALL HEXA (VALUE) * * ENTRY: A = CHARACTER * EXIT : A = CHARACTER * F MODIFIED * REGS NOT MODIFIED * * HEXA SUI 30H CHECKS IF CHAR = HEX RC . ...SET CY IF ERROR ADI 0E9H RC ADI 6 JP N10 ADI 7 RC . N10 ADI 0AH ORA A RET . * * * DIFF * ==== * * CALCULATES DIFFERENCE BETWEEN * ADDRESS PARTS OF TEST RANGE * SETS CY IF DIFF NEGATIVE * CALLING SEQUENCE: CALL DIFF (MAIN) * * ENTRY: STACK - HIGH ADDRESS * - LOW ADDRESS * EXIT : STACK - LOW ADDRESS * - DIFFERENCE * REGS,F MODIFIED * * DIFF INX SP INCR SP FOR GETTING INX SP ...H+L ADDR FROM STACK POP H HIGH ADDRESS IN H/L POP D LOW ADDRESS IN D/E MOV A,L SUB E MOV L,A DIFF IN H/L MOV A,H SBB D SET CY IF DIFF NEG MOV H,A PUSH D SAVE DIFF AND LOS ADDR. PUSH H ...ON STACK DCX SP DCX SP RET . * * * INCR * ==== * * INCREMENTS CURRENT ADDRESS AND * DECREMENTS CURRENT $IFFERENCE * SETS CY IF DIFF = 0 * CALLING SEQUENCE: CALL INCR (MAIN) * * ENTRY: DE = DIFF * HL = LOW ADDR * EXIT : DE = DIFF-1 * HL = LOW ADDR+1 * A,F MODIFIED * B NOT MODIFIED * * INCR MOV A,E ORA D DIFF = 0 RZ INX H INCR. ADDR DCX D DECR. DIFF RET * * * BOUT * ==== * * OUT OF A BYTE IN HEX * CALLING SEQUENCE: CALL BOUT (ERROR) * * ENTRY: A VALUE TO PRINT OUT * EXIT : A,B,F MODIFIED * DE,HL NOT MODIFIED * * BOUT MOV B,A SAVE 1ST VALUE IN B ANI 0F0H MASK UPPER 4 BITS RAR . RAR . RAR . RAR . CALL HEX1 CALL OUTP OUT UPPER 4 BIT MOV A,B ANI 0FH MASK LOWER 4 BIT CALL HEX1 CALL OUTP OUT LOWER 4 BIT RET . * * * HEX1 * ==== * * CONVERT BINARY VALUES IN ASCII-FORMAT * CALLING SEQUENCE: CALL HEX1 (BOUT) * * ENTRY: A = BINARY VALUE * EXIT : A = ASCII VALUE * REGS NOT MODIFIED * F MODIFIED * * HEX1 CPI 0AH CONVERT BINARY => ASCII JM HE1 ADI 7 ADJUST A - F HE1 ADI 30H ADJUST BIAS 4O ASCII RET . * * * ERROR * ===== * * ERROR OUTPUT FOR * ADDRESS, REFFERENCE VALUE, ACTUAL VALUE * CALLING SEQUENCE: CALL ERROR (MAIN,EXTEN) * * ENTRY: B = READING CHARACTER * EXIT : NO MODIFICATION * * ERROR PUSH PSW PUSH B MOV A,H CALL BOUT OUT HIGH PART OF ADDR. MOV A,L CALL BOUT OUT LOW PART OF ADDR. MVI B,2 CALL SPACE PRINT SPACE POP PSW PUSH PSW CALL BOUT OUT REFERENCE VALUE MVI B,3 CALL SPACE PRINT SPACE POP B POP PSW PUSH PSW PUSH B CALL BOUT OUT ACTUAL VALUE CALL CRLF POP B POP PSW RET . * * * SPACE * ===== * * PRINT SPACES ON CONSOLE BETWEEN VALUES * CALLING SEQUENCE: CALL SPACE (ERROR) * * ENTRY: B = SPACE COUNT * EXIT : DE,HL NOT MODIFIED * F MODIFIED * * SPACE MVI A,BLANK SPACE CALL OUTP DCR B JNZ SPACE RET * * * CRLF * ==== * * SEND CARRIAGE RETURN AND LINE FEED * ON CONSOLE PRINTER * CALLING SEQUENCE: CALL CRLF (ERROR) * * EXIT : A,F MODIFIED * REGS NOT MODIFIED * * CRLF MVI A,0DH TYPE CR CALL OUTP MVI A,0AH TYPE LF CALL OUTP RET . * * * BRKT * ==== * * CHECKS INPUT OF BREAK CHARACTER (CTRL/C) * RETURN TO START IF BREAK * * CHECK FRONT PANEL FOR 1 TO GO TO RESET, * AND 2 TO GO TO PTDOS * * CALLING SEQUENCE: CALL BRKT (MAIN,EXTEN) * * EXIT : A,F MODIFIED * REGS NOT MODIFIED * * IF 0 BRKT IN 0FFH ANI 1 JNZ START IN 0FFH ANI 2 JNZ RESET RET . ENDF BRKT CALL CONTST CHECK INPUT OF RZ . ...BREAK CHARACTER CALL CONIN CPI BREAK JZ START RESTART ? CPI ESCAP JZ 0BCB0H RET . * * * EXTEN * ===== * * EXTENDED DIAGNOSTIC * TEST ON READ/WRITE POSITION DEPEND CHARACTERS * CALLING SEQUENCE: CALL EXTEN (MAIN) * * ENTRY: STACK - CURRENT DIFF * - CURRENT ADDRESS * * EXTEN POP D SET CURRENT DIFF + ADDR POP H PUSH H PUSH D NUM0 MVI B,0FEH SET CODE COUNTER NUM1 DCR B JZ NUM0 LOAD MEMORY WITH CONTIG MOV M,B ...CHAR BETWEEN 0 => FD CALL INCR NEXT MEMORY LOCATION JNZ NUM1 POP D POP H SET CURRETN ADDR DIFF PUSH H ...AND ADDR. PUSH D NUM3 MVI B,0FEH READ CONTIG. CAHRACTERS NUM4 DCR B JZ NUM3 MOV A,M CMP B COMPARE READ AND WRITE CNZ ERROR ...CHARACTERS CALL INCR JNZ NUM4 CALL BRKT RESTART ? FIN JMP DIAG1 COPY PTDEFS LAST LINE OF MTEST FROM INTEL OR ...CHARACTERS CALL INCR