home *** CD-ROM | disk | FTP | other *** search
- ;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
-