So I decided to modify it to be able to display what byte unmatches at which address to determine which chip in which row is faulty.
Here are the changes:
- at $D000, two bytes give the size in byte minus one of the DRAM to scan. By default, it is $BDFF to cover the full 48KB except for the first 512 bytes because if $1000-$11ff were corrupted, you should not be able to load/run this program safely. You can alter those two bytes in the MZF file for a particular size.
- at $D002, two bytes give the start address in bytes of the DRAM to scan. By default, it is $1200 because if $1000-$11ff were corrupted, you should not be able to load/run this program safely. You can alter those two bytes in the MZF file for a particular address.
- at $D004, one byte as the start pattern byte. Every time a scan succeeds, this pattern byte is left rotated. By default, Pattern byte is all set to 1 except for bit 0 set to 0 -> the byte, when displayed, is inverted to tell which chip[s] is/are tested. This start pattern byte can be altered in the MZF file.
- at $D005, one byte as the OR mask byte. By default, mask byte is set to 0. This pattern byte is OR-ed with this mask byte before scanning. This mask byte can be altered in the MZF file.
- at $D006, the code starts.
Rational behind pattern and mask bytes:
Suppose you determine two chips of the second row were faulty and you took two chips of the third rows to replace them and scanning is now successful for the second row. You want to determine whether the other chips of the third row are working as well. You can use the mask byte to tell which chip to ignore (an empty socket returns a bit set to 1). That way, you can still determine which chips are working even with empty sockets in the row.
When an issue occurs, it displays in the middle of the display three numbers in hexadecimal: the first is the pattern byte tested (bits are inverted), the second is the read byte unmatching the pattern byte (bits not matching are the faulty chips) and the third is the faulty address to determine which row.
Here is the code:
Code: Select all
org 0xd000 size: dw 0xbdff addr: dw 0x1200 patt: db 0xfe mask: db 0x00 _main: l0: ld de,0x0f10 ld (0x1171),de ld hl,(patt) ld a,l or h push af cpl call 0x03c3 pop af ld bc,(size) ld hl,(addr) push bc push hl push hl pop de inc de ld (hl),a ldir pop hl pop bc l2: cpi jr nz,x0 jp pe,l2 ld hl,patt rlc (hl) jr l0 x0: dec hl push hl ld a,(hl) cpl call 0x03c3 pop hl call 0x03ba jp 0x0082 end _main
- avoid using calls to monitor ROM to display to be able to scan $1000-$11FF (MONITOR workplace) safely.
- display something like that:
Code: Select all
DDDDDDDD 01234567 ROW 1 -------- ROW 2 -X-----X ROW 3 -----XX-
I can provide the A80 (using Z80as) and MZF files if they are of some interest for the websites.