home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol073
/
memrs.asm
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
21KB
|
991 lines
;MEMR SEP 3, 1979
Page 0
VERS EQU 19 ;X.X
;
;
;Diss-assembly of Delta Products memory test program
;Written by D. Rasmussen January 1, 1979
;
;Extensively re-written and new tests added by Larry Alkoff
;
;Additional changes by Bill Bolton
;
;********************************************
; FIX LIST BY WFB
;********************************************
;15/JULY/81 V19-OPTIONAL CONOUT VIA BDOS/BIOS
; AND NEW COMMAND LINE ARGUMENT
; TEST, COMMENT TEXT UPDATED
;14/JULY/81 V18-CONOUT VIA BDOS
;14/JULY/81 V17-MESSAGES CORRECTED
;
;********************************************
; FIX LIST by LBA
;********************************************
;9/3 V16-MISC CLEANUP
;6/11 V15-BUGF ANI 7FH IN HEATH CRTIN
;5/25 V14-MSGS, RANGE LIMITS, FIX S.B. TEST
;5/19 V13-CONDX FOR MONITOR I/O
;5/18 V12-IMPROVE WALKING BIT AND CHECKERBOARD TEST
;5/15 V11-BUGF CONO PRESERVE REGS
; AND DEFAULT END ADDR (DEFEND) NOW JUST BELOW BIOS
;5/13/79 V0-OBJECT CODE AND SOURCE LISTING
; GIVEN TO LA BY HEAD OF DELTA PRODUCTS
; AT SAN FRANCISCO COMPUTER FAIR.
;
;********************************************
; INFORMATION ABOUT THIS TEST
;********************************************
;
; This memory test will use default address
;if starting and ending address questions
;are answered with a "CR".
;Memory test can be terminated by a "SP".
;
;Command line arguments are accepted as follows -
; '-' start of argument string
; 'B' console output via BDOS (for spooling or printing)
; 'R' random number test only
;
;The arguments may be given separately or together,
;i.e. -B, -R, -BR, -RB, or even -B -R
;The default upper test boundary address is modifed
;to the bottom of the BDOS if the B option is given.
;
; This test is designed to display the most common
;problems first and most uncommon ones last.
;The test never finishes by itself.
;The operator may terminate by pressing the
;space bar at any time.
;Generally memory chip failures will be found within 5 seconds.
;The test takes about 3 minutes to run all
;phases in a 32k board.
; To completely test for all address open and short
;combinations, the test should be run over a 4K boundry.
;Then run the test over the full range. There are some
;subtle things that get missed if you only run the
;test over the full range and not 4K at a time.
; The test falls into a random numbers test at the end
;of the first phase and will stay there until
;a space bar is pressed.
;If the memory board passes these tests and will
;run for an hour on the random numbers test
;without a problem, look elsewhere for your troubles.
;
;
;The following tests are performed:
;
;FAST COMPLEMENT:
;This is a test of ALL MEMORY starting at 0
;and testing to memtop (except its own loop).
;Pick up each byte, complement and try to store.
;Quickly test if properly complemented
;and restore original byte.
;
;STUCK BIT:
;1. Fills test area with 0FFH and checks for 0FFH.
;2. Then fills test area with 0's and tests for 0's.
;3. Then re-fills with 0FFH and tests
; just in case the bit was originally high in (1.).
;
;ADJACENT BIT SHORTED:
;Sets a single bit in all bytes high.
;This checks if a bit is shorted to the
;ones on each side.
;The test repeats 8 times, rotating
;the test bit from LSB to MSB.
;
;CHECKERBOARD:
;Fill memory with 0AAH, 55H pattern and check.
;This forms an alternating "checkerboard".
;Then reverse the pattern and re-check.
;
;WALKING BIT TEST:
;Fill memory with one bit set for each byte.
;The bit rotates at memory increases.
;For example, byte 1 has bit 1 set, byte 2 bit 2 etc.
;Then memory is checked for the proper pattern.
;This is repeated 8 times, rotating the bit each time.
;Then, the whole procedure is repeated rotating
;the opposite way.
;
;ADDRESS SHORTED:
;Fills all memory with 55H then writes an 0AAH
;at 0 (or the lowest memory tested).
;It then tests the rest of memory for 55H's.
;Then it clears location of the 0AAH and
;writes it into location 1.
;Then does same with location 2,4,8,etc setting
;a new address bit high each time and testing all of memory.
;If any address bit is shorted to another,
;the test will find an 0AAH in another location
;than the place it wrote one.
;This test takes the most time and is run last.
;
;RANDOM NUMBERS:
;A random number routine generates an 8 bit number
;pattern and writes it through all test memory.
;It then re-inserts the same seed to the routine
;and test reads the memory. A new seed is generated
;and the exercise is repeated with a new pattern.
;This goes on and on reporting each loop through
;until terminated with the space bar.
;
;
;********************************************
; SWITCHES
;********************************************
;
TRUE EQU 0FFFFH
FALSE EQU NOT TRUE
;
NOCHEK EQU FALSE ;NO RANGE CHECKING
HEATH EQU FALSE
CRAM EQU 4200H AND HEATH ;CP/M RAM BASE (0=STANDARD)
;
; PICK ONE I/O ROUTINE
;
CPMIO EQU TRUE ;I/O VIA CP/M, WARM BOOT EXIT
LAPIO EQU FALSE ;I/O VIA LAPPLE
H84CRT EQU FALSE ;HEATH ROUTINE
;
;********************************************
; EQUATES
;********************************************
;
DEFST EQU 500H ;DEFAULT STARTING ADDR (INCLUSIVE)
DEFEND EQU 0F5FFH ;DEFAULT ENDING ADDR (INCLUSIVE)
TPA EQU CRAM+100H
STACK EQU CRAM+100H ;STACK
RETRYS EQU 18 ;# OF RETRYS
ENDADD EQU STACK-2 ;ENDING ADDRESS
MEM EQU STACK-4 ;STARTING ADDRESS
MEMTOPL EQU STACK-6 ;STORE TOP OF MEMORY
COUNT EQU STACK-7 ;STORAGE FOR RETRY COUNT
TESTBYTE EQU STACK-8 ;STORAGE
TBUF EQU CRAM+82H ;OR STACK-9 IF NOT CP/M TBUFF
SEED EQU STACK-11
SEEDST EQU STACK-13
TEMP EQU STACK-15
WBOOT EQU CRAM+0 ;WARM BOOT ENTRY
BDOS EQU CRAM+5 ;BDOS ENTRY
CR EQU 0DH
LF EQU 0AH
BD$OFF EQU -7 ;OFFSET TO BELOW BDOS
BI$OFF EQU -4 ;OFFSET TO BELOW BIOS
;
;********************************************
; START OF PROGRAM
;********************************************
;
ORG TPA
;
START: JMP START2
;
JEXIT: JMP MONIT
JCONI: JMP CONIN ;JUMPS MAY BE PATCHED
JCONS: JMP CONST
JCONO: JMP CONOUT
;
;********************************************
; MAIN LOOP
;********************************************
;
START2:
LXI SP,STACK-16
CALL INIT
MVI A,RETRYS ;SET RETRY COUNT
STA COUNT
LXI D,SIG ;SIGN ON
CALL PMSG ;PRINT IT
CALL CRLF
CALL CRLF
LDA BDOS$FLAG
ORA A ;BIOS OUTPUT
JNZ BDOS$1 ;NO
LXI D,BIOSMSG
CALL PMSG
LXI D,LOCMSG
CALL PMSG
LHLD WBOOT+1 ;GET LOCATION OF BIOS ENTRY
LXI D,BI$OFF+1 ;OFFSET TO START OF BIOS
DAD D
MVI L,0
JMP GO$ON$1
;
BDOS$1:
LXI D,BDOSMSG
CALL PMSG
LXI D,LOCMSG
CALL PMSG
LHLD BDOS+1 ;GET LOCATION OF BDOS ENTRY
LXI D,BD$OFF+1 ;OFFSET TO START OF BDOS
DAD D
MVI L,0
GO$ON$1:
CALL PHL ;PRINT LOCATION OF BIOS
LXI D,MEMSG
CALL PMSG
CALL MEMTOP ;FIND TOP OF MEMORY
SHLD MEMTOPL ;AND SAVE
CALL PHL ;AND PRINT IT
LXI D,SPMSG
CALL PMSG
LXI D,XPMSG ;EXPLAIN
CALL PMSG
LDA BDOS$FLAG
ORA A ;BIOS OUTPUT?
JNZ BDOS$4 ;NO
LXI D,BIOSMSG
JMP GO$ON$4
;
BDOS$4:
LXI D,BDOSMSG
GO$ON$4:
CALL PMSG
CALL CRLF
LXI D,SMSG ;STARTING ADDR MSG
CALL PMSG ;PRINT IT
LOWER0: ;GET STARTING ADDRESS
CALL GETADD ;INPUT ADDR FROM CONIN
JNC LOWER2 ;NC MEANS ADDR ENTERED
LXI H,LASTB ;CY=CR GIVES DEFAULT
PUSH H
CALL PHL ;PRINT DEFAULT ADDR
POP H
LOWER2:
IF HEATH OR NOCHEK
SHLD MEM ! JMP UPPER0 ;NO CHECKING
ENDIF
XCHG ;ST ADDR TO DE
LXI H,LASTB ;TOP OF THIS PROGRAM
CALL HILO ;MUST BE BELOW
XCHG ;STARTING ADDR
SHLD MEM ;SAVE STARTING ADDR
JNC UPPER0 ;LOWER ADDR IS OK, GET UPPER
LXI D,LOWMSG
CALL PMSG ;SAY TOO LOW
LXI H,LASTB
CALL PHL ;SAY LOWEST OK ADDR
JMP LOWER0
UPPER0: ;GET ENDING ADDR
LXI D,EMSG ;ENDING ADDR MSG
CALL PMSG
CALL GETADD ;GET ENDING ADDR FROM KEYBOARD
JNC UPPER2 ;NC MEANS ADDR ENTERED
LDA BDOS$FLAG
ORA A ;BIOS OUTPUT ?
JNZ BDOS$2 ;NO
LHLD WBOOT+1
LXI D,BI$OFF ;ESTABLISH DEFAULT ADDRESS
JMP GO$ON$2
;
BDOS$2:
LHLD BDOS+1 ;CY=CR MEANS DEFAULT
LXI D,BD$OFF ;ESTABLISH DEFAULT END ADDR
GO$ON$2:
DAD D ;JUST BELOW BIOS OR BDOS
PUSH H
CALL PHL ;PRINT DEFAULT ADDR
POP H
UPPER2:
XCHG ;END ADDR TO DE
IF HEATH OR NOCHEK
JMP UPPERX ;NO CHECKING
ENDIF
LHLD MEM ;GET START ADDR
INX H
CALL HILO ;ERROR,END ADDR MUST
JNC UPPERX ;BE ABOVE START ADDR
LXI D,UPPMSG
CALL PMSG
JMP UPPER0 ;TRY AGAIN
;
UPPERX:
XCHG ;END ADDR
SHLD ENDADD ;SAVE ENDING ADDR
SHLD SEED ;USE AS SEED ALSO
LXI D,CTUMSG ;CONTINUE?
CALL PMSG
WAIT:
CALL CSTAT ;WAIT FOR RESPONSE
ORA A
JZ WAIT
RESTART:
CALL CSTAT ;SEE IF ABORT
CALL CRLF
LDA RAND$FLAG
ORA A ;DO RANDOM TEST ONLY ?
JNZ RTEST ;YES, GO DO RANDOM NUMBERS
;
;********************************************
; DO FAST COMPLEMENT TEST - ALL MEMORY
;********************************************
;
LXI D,FCTST
CALL PMSG ;PRINT FAST COMP TEST
IF NOT HEATH
LXI H,0 ;START AT 0
ENDIF
IF HEATH
LXI H,2000H
ENDIF
LXI D,FCTEST-1 ;AND STOP AT LOOP
CALL FCTEST ;DO TEST
LHLD MEMTOPL ;NOW TEST
XCHG ;TO MEMTOP
LXI H,FCLPX ;STARTING HERE
CALL FCTEST
;
;********************************************
; DO BIT STUCK TEST
;********************************************
LXI D,BSTST
CALL PMSG ;PRINT TEST
MVI B,0FFH ;FF TEST START
CALL TESTW ;WRITE TEST BYTE
CALL TESTR ;CHECK TEST BYTE
MVI B,0 ;ZEROS TEST
CALL TESTW ;WRITE TEST BYTE 0
CALL TESTR ;TEST
MVI B,0FFH ;BACK HI TEST
CALL TESTW ;WRITE TEST BYTE 0FFH
CALL TESTR ;TEST
;
;********************************************
; DO SHORTED BIT TEST
;********************************************
LXI D,SBTST
CALL PMSG ;PRINT BIT SHORT TEST
MVI A,1 ;ROTATE BIT TEST
LOOP2: MOV B,A ;MAKE TEST BYTE
CALL ROTTST ;DO TEST
JNC LOOP2 ;DONE WITH 8 BITS?
;
;********************************************
; DO CHECKERBOARD TEST
;********************************************
LXI D,CBTST
CALL PMSG ;PRINT CHECKBOARD TEST
MVI B,55H
CALL CBTEST
MVI B,0AAH
CALL CBTEST
;
;********************************************
; DO WALKING BIT TEST
;********************************************
LXI D,WBLTST
CALL PMSG ;PRINT WALKING BIT LEFT
MVI B,80H
WALL: CALL WALKL ;DO TEST, SAVES B
MOV A,B
RLC ;NEXT SEED BIT
MOV B,A
CPI 80H ;DONE IF
JNZ WALL
LXI D,WBRTST
CALL PMSG ;PRINT WALKING BIT RIGHT
MVI B,1
WALR: CALL WALKR ;DO TEST, SAVES B
MOV A,B
RRC ;NEXT SEED BIT
MOV B,A
CPI 1 ;DONE IF
JNZ WALR
;
;********************************************
; DO ADDRESS LINE TEST
;********************************************
LXI D,ALTST
CALL PMSG ;PRINT ADDR LINE TEST
MVI B,055H ;TEST BYTE
CALL ADTEST ;TEST
MVI B,0AAH ;TEST BYTE
CALL ADTEST ;TEST
;
;********************************************
; DO RANDOM NUMBER TEST
;********************************************
RTEST: LXI D,RNTST
CALL PMSG
MVI C,'1'
RANDLP: PUSH B
CALL RNDW ;DO RANDOM # TEST
CALL SPACE
POP B
CALL CONO
INR C
MVI A,'9'
CMP C
JNZ RANDLP ;CONTINUE RANDOM NR TEST
;
LXI D,MSGOK ;POINT AT TEST COMPLETE MSG
CALL PMSG
JMP RESTART ;START TEST AGAIN WITH OLD PARAMETERS
;
;********************************************
; FINISHED WITH MAIN LOOP
;********************************************
;
ERROR: ;PRINT ERROR LOCATIONS
PUSH B
PUSH D
PUSH H
PUSH PSW ;SAVE ALL REGS
CALL CRLF
LXI D,MSG1
LDA COUNT
CPI RETRYS
CZ PMSG ;PRINT LABELS
CALL PHL ;PRINT HL REG
MOV D,B ;GET SHOULD BE DATA
CALL CNVT ;PRINT HEX
MOV A,B
CALL CNVTB
POP PSW
PUSH PSW
MOV D,A ;GET WAS DATA
CALL CNVT ;PRINT HEX
POP PSW
CALL CNVTB
LDA COUNT ;GET ERROR COUNT
DCR A ;ONE LESS
STA COUNT ;PUT BACK COUNT
JNZ MORET
LXI D,CTUMSG
CALL PMSG
CALL GETADD ;SEE IF STOP OR CONTINUE
MVI A,RETRYS
STA COUNT ;RESET COUNT
MORET: POP H ;GET ALL REGS BACK
POP D ;AND CONTINUE TEST
POP B
RET
;
PHL: ;PRINT HL REGISTER
MOV D,H
CALL CNVT ;MAKE ADDR OF ERROR ASCII
MOV D,L
CALL CNVT
CALL TAB
RET
;
PMSG: ;PRINT STRING POINTED BY DE
CALL CSTAT ;POSS ABORT AT EVERY PMSG
PMSGLP: LDAX D ;GET BYTE TO PRINT
ORA A ;END OF TEXT?
RZ
MOV C,A ;CONVENTION
CALL CONO ;GOTO OUTPUT
INX D
JMP PMSGLP
;
FCTEST: ;COMPLEMENT BYTE AND RESTORE
MOV A,M ! CMA
MOV M,A ;VERY FAST CHANGE
MOV B,A ;SAVE COMPLEMENTED BYTE
MOV C,M ;SEE WHAT GOT STORED
MOV A,B ! CMA ;ORIG BYTE
MOV M,A ;ALWAYS RESTORED
FCLPX: MOV A,C ! CMP B ;DID IT COMPLEMENT?
CNZ ERROR
INX H ! CALL HILO
JNC FCTEST ;DO MORE
RET ;DONE
;
LOAD: ;GET ADDRESSES TO TEST
CALL CSTAT ;POSS ABORT AT EVERY LOAD
LHLD ENDADD ;GET ENDING ADDR
XCHG ;INTO DE
LHLD MEM ;GET STARTING ADDR
RET
;
TESTW: ;FILL MEMORY WITH TEST BYTE
CALL LOAD
WLOOP: MOV M,B ;PUT TEST BYTE IN MEMORY
INX H ! CALL HILO
JNC WLOOP
RET
;
TESTR: ;READ AND COMPARE MEMORY TO TEST BYTE
LHLD MEM
TESTADR:
XCHG
LHLD ENDADD ;GET STARTING ADDR
XCHG
RLOOP: MOV A,M ! CMP B ;CHECK BYTE
CNZ ERROR
INX H ! CALL HILO
JNC RLOOP
RET
;
CBTEST: ;CHECKERBOARD TEST
CALL LOAD
CBWLP: MOV M,B ;B HAS TEST BYTE
INX H ! CALL HILO
JC CBR ;TIME TO READ
MOV A,B ! CMA ;55H BECOMES 0AAH
MOV M,A ;STORE COMPLEMENT
INX H ! CALL HILO
JNC CBWLP
CBR: ;READ AND TEST CHECKERBOARD
CALL LOAD
CBRLP: MOV A,M ! CMP B ;CHECK BYTE
CNZ ERROR
INX H ! CALL HILO
RC ;DONE
MOV A,B ! CMA ! MOV B,A
MOV A,M ! CMP B ;CHECK BYTE
CNZ ERROR
MOV A,B ! CMA ! MOV B,A
INX H ! CALL HILO
JNC CBRLP
RET
;
CSTAT: ;CONSOLE ABORT (SAVES ALL REGS)
PUSH H ! PUSH D ! PUSH B
CALL JCONS ;SEE IF KEY STRUCK
ORA A ;SET FLAGS
JZ NOKEY
CALL JCONI ;GET KEY
CPI ' ' ;EXIT IF SPACE
JZ RETURN
CPI 3 ;OR ^C
JZ RETURN
CPI 18H ;^X
JZ START ;RE-START TEST
NOKEY: POP B ! POP D ! POP H
RET
;
CNVT: ;CONVERT REG D TO HEX ASCII
MOV A,D
RRC ;GET HIGH NIBBLE
RRC
RRC
RRC
ANI 00FH
CALL CNV ;MAKE NIBBLE ASCII
MVI A,00FH
ANA D ;GET LOW NIBBLE
CALL CNV ;MAKE NIBBLE ASCII
RET
;
CNV: ADI 030H
CPI 03AH
JM DONE
ADI 007H
DONE: MOV C,A
CALL CONO
RET
;
ROTTST: ;ROTATE TEST
PUSH PSW
CALL TESTW
POP PSW
PUSH PSW
CALL TESTR
POP PSW
RLC
RET
;
WALKL: ;LEFT WALKING BIT TEST
PUSH B ;SAVE SEED
CALL LOAD
WLSTOR: MOV A,B ;GET BYTE
RLC ;ROTATE LEFT
MOV B,A ;AND RESAVE IN B
MOV M,A ;TO MEMORY
INX H ! CALL HILO
JNC WLSTOR
CALL LOAD
POP B ! PUSH B ;GET SEED BIT
WLTST: MOV A,B ;NOW CHECK
RLC
MOV B,A
MOV A,M ! CMP B ;CHECK BYTE
CNZ ERROR
INX H ! CALL HILO
JNC WLTST
POP B ;ORIG SEED
RET ;DONE
;
WALKR: ;RIGHT WALKING BIT TEST
PUSH B ;SAVE SEED
CALL LOAD
WRSTOR: MOV A,B ;GET BYTE
RRC ;ROTATE RIGHT
MOV B,A ;AND RESAVE IN B
MOV M,A ;TO MEMORY
INX H ! CALL HILO
JNC WRSTOR
CALL LOAD
POP B ! PUSH B ;GET SEED BIT
WRTST: MOV A,B ;NOW CHECK
RRC
MOV B,A
MOV A,M ;CHECK BYTE
CMP B
CNZ ERROR
INX H ! CALL HILO
JNC WRTST
POP B ;ORIG SEED
RET ;DONE
;
ADTEST: ;ADDRESS SHORTED TEST
CALL TESTW ;FILL MEMORY WITH TEST BYTE
MOV A,B
STA TESTBYTE ;SAVE TEST BYTE
CALL LOAD
CMA
MOV M,A
INX H
CALL TESTADR
LXI B,1 ;START ADDR LSB ON
LOOP4: LHLD MEM
DAD B
RC ;ROLLED OVER 65K
MOV A,D ;GET TEST ADDR
SUB H ;PAST END?
RC ;KEEP GOING IF NO CARRY
JNZ INXHA
MOV A,E
SUB L
RC
INXHA: LDA TESTBYTE
PUSH B
MOV B,A
CMA ;INVERT BITS
MOV M,A ;WRITE TO TEST MEMORY
INX H ! CALL HILO
JC OVERFL
CALL TESTADR ;TEST
POP H
DAD H
RC
MOV B,H
MOV C,L
JMP LOOP4
;
OVERFL: POP B
RET
;
GETBYT: CALL CHAR
RZ
CPI ' ' ;EXIT IF SPACE
JZ RETURN
CPI 3 ;^C
JZ RETURN
CPI 18H ;^X
JZ START
CALL ATOH
JP REENTER
RRC
RRC
RRC
RRC
MOV E,A
PUSH D
CALL CHAR
POP D
JZ REENTER
CALL ATOH
JP REENTER
ORA E
RET
;
CHAR: CALL JCONI
CPI CR
STC ;SET CY FLAG (MAYBE CR)
RZ
PUSH PSW
MOV C,A
CALL CONO
POP PSW
RET
;
ATOH: SUI 030H
JM BAD
CPI 00AH
RM
SUI 007H
CPI 00AH
JM BAD
CPI 010H
RM
BAD: XRA A ;SET ZERO FLAG
RET
;
REENTER:
POP H ;FIX STACK
LXI D,IEMSG
CALL PMSG
GETADD: ;INPUT 4 HEX VALUES FROM CONSOLE
CALL GETBYT
RC
MOV H,A
SHLD TEMP
CALL GETBYT
LHLD TEMP
MOV L,A
RET
;
CNVTB: ;PRINT REG A IN BINAR
MOV E,A ;SAVE A
MVI D,2 ;TWO SPACES
CALL TLOP
MVI B,2 ;NIBBLE COUNT
PNIBB: MVI D,4
ALLBIT: MOV A,E ;RESTORE A
RAL
MOV E,A
MVI C,030H ;0
JNC ZERO
MVI C,031H ;1
ZERO: CALL CONO
DCR D
JNZ ALLBIT
CALL SPACE ;PRINT SPACE
DCR B
JNZ PNIBB
TAB: MVI D,004H
TLOP: CALL SPACE
DCR D
JNZ TLOP
RET
;
CRLF: MVI C,CR ! CALL CONO
MVI C,LF ! JMP CONO
;
SPACE: MVI C,020H
CONO: PUSH B ! PUSH D ! PUSH H
LDA BDOS$FLAG
ORA A ;BIOS OUTPUT ?
JNZ BDOS$3 ;NO
CALL JCONO ;YES
JMP GO$ON$3
;
BDOS$3:
MOV E,C
MVI C,2
CALL BDOS
GO$ON$3:
POP H ! POP D ! POP B
RET
;
;RANGE TESTING ROUTINE - CY SET IF RANGE EXCEEDED
; IF HL=DE THEN NC AND Z SET
; IF HL<=DE THEN NC
; IF HL>DE THEN CY AND NZ
; IF HL=0 THEN CY AND Z SET
HILOX: INX H ;INCREMENT PNTR, CHECK RANGE
HILO:
MOV A,H ! ORA L
STC ! RZ ;TEST HL=0
MOV A,E ! SUB L ;DE-HL
MOV A,D ! SBB H
RET
;
RNDW: ;WRITE RANDOM NUMBERS
LHLD SEED ;GET SEED
SHLD SEEDST ;SAVE IT FOR LATER
CALL LOAD
RNDWL: CALL RND
MOV M,B
INX H ! CALL HILO
JNC RNDWL
;
RNDR: ;CHECK AND READ RANDOM NUMBERS
LHLD SEEDST ;START WITH SAME SEED
SHLD SEED ;PASS SEED TO GENERATOR
CALL LOAD ;GET TEST ADDR
RNDRL: CALL RND
MOV A,M
CMP B
CNZ ERROR
INX H ! CALL HILO
JNC RNDRL
RET ;TEST DONE
;
RND: ;GENERATE RANDOM NR FROM SEED
PUSH H
LHLD SEED
MOV A,L
XRA H
MOV B,A
RLC
MOV L,A
ADD H
MOV H,A
SHLD SEED
POP H
RET
;
RETURN:
LXI SP,STACK-16 ;FIX STACK
JMP JEXIT
;
MEMTOP: ;FIND TOP OF MEMORY
IF NOT HEATH
LXI H,100H-1
ENDIF
IF HEATH
LXI H,2000H-1
ENDIF
MEMLOOP:
INR H
JZ FOUND ;ABOVE 64K BOUNDRY
MOV B,M ;GET MEMORY BYTE
MOV A,M ;AND IN A
CMA
MOV M,A ;STORE COMP
MOV C,M ;GET BACK COMP BYTE
CMP C ;DID IT STORE OK?
MOV M,B ;PUT BACK ORIG
JZ MEMLOOP
FOUND: DCR H ;FOUND IT
RET ;HL=MEMTOP
;
;********************************************
; MESSAGE AREA
;********************************************
SIG: DB CR,LF
DB 'MEMRS Memory Test - Version '
DB VERS/10+30H, '.', VERS MOD 10+30H
DB 0
BIOSMSG:DB 'BIOS',0
BDOSMSG:DB 'BDOS',0
LOCMSG: DB ' located at ',0
MEMSG: DB ' Top of memory at ',0
SPMSG: DB CR,LF
DB 'Press "SP" or "^C" to warm boot at any time'
DB CR,LF
DB 'or "^X" to restart test from beginning. ',0
XPMSG: DB CR,LF
DB 'Response of "CR" gives default test range'
DB CR,LF
DB 'which starts above this program and ends at ',0
MSG1: DB 'LOCATION SHOULD BE WAS'
DB CR,LF,0
CTUMSG: DB CR,LF
DB '"CR" to continue test - "SP", "^C" to quit,'
DB ' "^X" to restart.',0
MSGOK: DB CR,LF
DB 'Test series complete', 0
SMSG: DB CR,LF
DB 'Starting address (Hex or "CR") ',0
EMSG: DB CR,LF
DB 'Ending address (Hex or "CR") ',0
IEMSG: DB CR,LF
DB 'Input error - Retype 4 hex digits ',0
FCTST: DB CR,LF
DB 'Non-destructive test of ALL MEMORY starting at '
IF NOT HEATH
DB '0 ',0
ENDIF
IF HEATH
DB '2000H ',0
ENDIF
BSTST: DB CR,LF
DB 'Bit stuck high or low test ',0
SBTST: DB CR,LF
DB 'Adjacent bits shorted test ',0
CBTST: DB CR,LF
DB 'Checkerboard (55AAH pattern) test ',0
WBLTST: DB CR,LF
DB 'Walking bit left test ',0
WBRTST: DB CR,LF
DB 'Walking bit right test ',0
ALTST: DB CR,LF
DB 'Address line test ',0
RNTST: DB CR,LF
DB 'Random number test - Cycle: ',0
LOWMSG: DB CR,LF
DB 'Re-enter, starting address must be at least ',0
UPPMSG: DB CR,LF
DB 'Re-enter, ending address too low',0
;
;
;********************************************
; INSERT CUSTOM INITIALIZATION AND I/O ROUTINES HERE
;********************************************
;
IF CPMIO ;THESE ROUTINES CP/M USERS
MONIT EQU WBOOT
CONST EQU 6 ;CONSOLE STATUS TO REG A
CONIN EQU 9 ;CONSOLE CHAR TO REG A
CONOUT EQU 0CH ;CHAR FROM REG C TO CONSOLE
;
INIT: ;SET HI ORDER ADDR BYTES
LDA WBOOT+2
STA JCONS+2
STA JCONI+2
STA JCONO+2
JMP INIT1
ENDIF
;
IF LAPIO ;USES LAPPLE MONITOR
MONIT EQU 0D000H
CONST EQU 0D012H
CONIN EQU 0D003H
CONOUT EQU 0D009H
INIT: JMP INIT1 ;NO INIT NEEDED
ENDIF
;
IF H84CRT
MONIT EQU WBOOT
INIT: JMP INIT1
CONST EQU $
CRTST: IN H84ST ! ANI 1
MVI A,0 ! RZ ! CMA ! RET
CONIN EQU $
CRTIN: IN H84ST ! RAR ! JNC CRTIN
IN H84IO ! ANI 7FH ! RET
CONOUT EQU $
CRTOUT: IN H84ST ! ANI 20H ! JZ CRTOUT
MOV A,C ! OUT H84IO ! RET
H84ST EQU 0EDH
H84IO EQU 0E8H
ENDIF
;
INIT1:
LXI H,TBUF ;POINT TO COMMAND LINE
MOV A,M ;GET FIRST BYTE
CPI '-' ;OPTION CHARACTER ?
JNZ DEFAULT ;NO
CLOOP:
INX H ;POINT TO NEXT BYTE
MOV A,M
CPI 00 ;END OF COMMAND LINE ?
RZ ;YES
CPI 'B' ;BDOS OUTPUT ?
CZ SET$BDOS ;YES
CPI 'R' ;RANDOM TEST ONLY ?
CZ SET$RAND ;YES
JMP CLOOP ;NO
;
DEFAULT:
XRA A
STA BDOS$FLAG ;BIOS OUTPUT
STA RAND$FLAG ;FULL TEST
RET
;
SET$BDOS:
MVI A,TRUE ;BDOS OUTPUT
STA BDOS$FLAG
RET
;
SET$RAND:
MVI A,TRUE ;RANDOM NUMBER TEST ONLY
STA RAND$FLAG
RET
;
;********************************************
;
BDOS$FLAG DB 0 ;BDOS OUTPUT FLAG
RAND$FLAG DB 0 ;RANDOM TEST FLAG
;
LASTB EQU $ ;END OF PROGRAM
;
END START