I wrote it from scratch so it can be very fast and can tell you which chip is defective in which row and it can be easily modified in the binary through a hexadecimal editor :
0080h: 2 bytes, little endianness, RAM size in bytes to test, default: 0xBDFF, that is 48 KByte minus 512 bytes because the range $1000-$11FF are used by MONITOR.
0082h: 2 bytes, little endianness, RAM start address in bytes to test, default: 0x1200 because the range $1000-$11FF are used by MONITOR.
0084h: 1 byte, bit pattern. Bits D0...D7 of a row. A bit set to 0 is the tested chip and the other bits are set to 1. Default: 0xFE.
0085h: 1 byte, exclusion mask. Bits D0...D7 of a row. A bit #n set to 1 means the chip #n is not tested and may not be socketed. Default: 0x00 (all are tested)
The program test a chip #n in the given memory range then rotates bits in 0084h to redo the test with the next chip forever until one defective chip is detected and get back to monitor prompt.
EDIT: it seems I cannot attach any files here so I insert the source here. If soemone wants to add them on the website sharpmz.org, just ask me.
Code: Select all
org 0xd000 size: dw 0xbdff ; size in bytes (minus 512 bytes because ROM monitor use them) addr: dw 0x1200 ; start address (minus 512 bytes because ROM monitor use them) patt: db 0xfe ; bit pattern, all bits but bit 0 initially set to 1 (testing D0) mask: db 0x00 ; exclusion mask, chip #n is excluded with bit #n set to 1 so the slot of chip #n may be empty _main: l0: ld de,0x0f10 ; column: 16, line: 15 ld (0x1171),de ; set monitor cursor ld hl,(patt) ; load pattern into L and mask into H ld a,l ; set current pattern to test or h ; current pattern is OR-ed with exclusion mask push af ; save the current pattern cpl ; for display, we prefer a two-complemented pattern to determine which chip is tested (01, 02, 04, 08, 10, 20, 40 and 80) call 0x03c3 ; monitor call to display hexadecimal byte from A pop af ; restore the current pattern ld bc,(size) ; set the size to fill ld hl,(addr) ; set the start address to fill push bc ; save the size for scan push hl ; save the start address for scan push hl ; transfer HL into DE pop de inc de ; and increase DE ld (hl),a ; set the first byte with the current pattern ldir ; trick to fill all the memory block with the current pattern pop hl ; restore the start address to scan pop bc ; restore the size to scan l2: cpi ; read the byte and compare to the current pattern jr nz,x0 ; if not equal a chip must be defective jp pe,l2 ; otherwise loop to scan the next byte ld hl,patt rlc (hl) ; rotate the byte in patt (next chip) jr l0 ; loop for testing the next chip x0: dec hl ; retrieve the faultive address push hl ; save it ld a,(hl) ; read the byte at this address cpl ; for display, we prefer a two-complemented bytes call 0x03c3 ; monitor call to display hexadecimal byte from A so the defective chip can be determined pop hl ; restore the faultive address call 0x03ba ; monitor call to display hexadecimal word from HL so the RAM row can be determined jp 0x0082 ; back to monitor prompt end _main