;-------------------------------------------------- ; ; MEMORY CONFIDENCE TEST ; ; CHECKS ALL RAM LOCATIONS FOR READ/WRITE. ; FINDS 'MOST' BAD CHIPS. COLD BOOT REQUIRED ; AFTER RUN, AS BDOS IS CLOBBERED. ; HALTS ON FIRST ERROR ENCOUNTERED. ; INVOKE WITH 'MCONF XX', WHERE XX IS MEMORY ; SIZE IN K (DECIMAL). ; ; 11/26/79 ; ;-------------------------------------------------- ORG 100H MCONF: LXI SP,100H ;SET SP LXI H,SGNON ;POINT TO SIGNON MESSAGE CALL PRINT ;PRINT IT MVI E,0 ;INIT MEMORY SIZE LXI H,5DH ;POINT TO ASCII MEMORY SIZE GETSIZ: MOV A,M ;GET CHARACTER CPI ' ' ;SPACE? JZ GOTSIZ ;YES, HAVE BINARY SIZE CPI '0' ;CHECK CHAR JC SIZERR ;<0 ILLEGAL CPI '9'+1 ;CHECK CHAR JNC SIZERR ;>9 ILLEGAL ANI 0FH ;MAKE BCD MOV C,A ;SAVE MOV A,E ;GET SIZE ADD A ;X2 MOV D,A ;SAVE X2 ADD A ;X4 ADD A ;X8 ADD D ;X10 ADD C ;+ NEW DIGIT MOV E,A ;AND REPLACE INX H ;POINT TO NEXT CHAR JMP GETSIZ ;AND GET IT GOTSIZ: MOV L,E ;#K IN L MVI H,0 ;0 IN H MVI B,10 ;X1024 = 10 SHIFTS SHIFT: DAD H ;SHIFT TO LEFT DCR B ;COUNT SHIFTS JNZ SHIFT ;MORE TO DO MOV A,H ;GET HIGH BYTE OF MEM SIZE STA ENDH ;STORE FOR LATER COMPARES MVI A,55H ;GET TEST PATTERN LXI H,START ;POINT TO START ADDRESS TESM1: MOV M,A ;STORE PATTERN CMP M ;COMPARE JNZ BAD ;ERROR IF NOT SAME CMA ;INVERT PATTERN MOV M,A ;STORE PATTERN CMP M ;COMPARE JNZ BAD ;ERROR IF NOT SAME CALL NEXMEM ;INCREMENT LOCATION JNZ TESM1 ;NOT AT END OF MEM YET LXI H,START ;RESET MEM POINTER TESM2: MOV M,L ;ADDRESS TO MEMORY CALL NEXMEM ;INCREMENT LOCATION JNZ TESM2 ;NOT AT END OF MEM YET LXI H,START ;RESET MEMORY POINTER TESM3: MOV A,M ;GET CONTENTS CMP L ;SHOULD BE SAME AS ADDRESS JNZ BAD ;ERROR IF NOT CALL NEXMEM ;INCREMENT MEMORY LOCATION JNZ TESM3 ;NOT AT END OF MEM YET LXI H,OKMSG ;POINT TO OK MESSAGE CALL PRINT ;PRINT IT HLT ; ; SIZERR: LXI H,SERMS ;POINT TO ERROR MESSAGE CALL PRINT ;PRINT IT JMP 0 ;REBOOT ; ; NEXMEM: INX H ;INCREMENT MEM POINTER MOV B,A ;SAVE A LDA ENDH ;GET END OF MEMORY CMP H ;ARE WE THERE? MOV A,B ;RESTORE A RET ; ; BAD: XCHG ;SAVE HL LXI H,ERROR ;POINT TO ERROR MESSAGE CALL PRINT ;PRINT IT MOV A,D ;GET HIGH BYTE ERROR ADDR CALL OUTA ;PRINT IT MOV A,E ;GET LOW BYTE ERROR ADDR CALL OUTA ;PRINT IT MVI A,'H' ;FOR HEX CALL CONOT ;PRINT IT HLT ; ; PRINT: MOV A,M ;GET CHARACTER ORA A ;CHECK FOR 0 RZ ;WE'RE DONE CALL CONOT ;PRINT CHARACTER INX H ;NEXT JMP PRINT ; ; OUTA: PUSH PSW ;SAVE A RLC RLC RLC RLC ;SWAP NIBBLES CALL HASCI ;MAKE ASCII CALL CONOT ;PRINT IT POP PSW ;RESTORE A CALL HASCI ;MAKE OTHER NIBBLE ASCII CALL CONOT ;PRINT IT RET ; ; HASCI: ANI 0FH ;CLEAR JUNK ADI '0' ;MAKE ASCII CPI '9'+1 ;>9? RC ;NO, RETURN ADI 7 ;ADJUST FOR A-F RET ; ; ;************************************************* ; DIRECT I/O BECAUSE BDOS IS DEAD ;************************************************* CONOT: PUSH PSW ;SAVE CHARACTER CONO1: IN CONSTA ;GET CONSOLE STATUS ANI TBMT ;XMIT READY? JZ CONO1 ;NO POP PSW ;GET CHARACTER BACK OUT CONDAT ;SEND IT RET ; ; SGNON: DB 13,10,'MEMORY CONFIDENCE TEST',13,10 DB 'DESTROYS BDOS',13,10,0 SERMS: DB 'MEMORY SIZE ERROR',0 ERROR: DB 'R/W ERROR @ ',0 OKMSG: DB 'MEMORY OK',0 ; ; ENDH: DS 1 START: EQU $ ; ; CONSTA: EQU 0C9H CONDAT: EQU 0C8H TBMT: EQU 1 ; ; END MCONF