IMD 1.18: 22/01/1996 6:58:43 micro cornucopia kaypro user group disk 18 diagnostics     DISKTESTMAC DISKTESTMAC<4DISKTSTCOM2DISKTSTCOM !MDIAGLPTMAC"#$%&'()*+,-./01MDIAGLPTMAC23456789:;<=>?@AMDIAGLPTMACBCDEDISKTESTDOCUFGHIJKLMNOP10DSKTSTCOMQRSMDIAGXXXDOChTUVWXYZ[\]^_`MEMRS COMabMDIAGTTYMACcdefghijklmnopqrMDIAGTTYMACstuvwxyz{|}~MDIAGTTYMACMEMRS ASMMEMRS ASM(; 'Z-80 Floppy Disk Test' ; Floppy Disk Test for Z-80 CP/M Systems ; ; version 1.0 16 December 1980 ; version 1.1 2 January 1984 DmC ; ; Resale of this program is PROHIBITED ; ; Copyright (c) 1980 by ; Ray Duncan ; Laboratory Microsystems ; 4147 Beethoven Street ; Los Angeles, CA 90066 ; ; Modified for the Kaypro Computer Line ; By Micro Cornucopia Magazine ; aseg .z80 org 100h ; cpm equ 5 ;references to wboot equ 0 ;operating system ; ; references to ASCII char cr equ 0MEMRS DOC7CRC COMCRCKLISTCRCDISKALGNCOMDISKALGNMACEMDIAGLPTCOMMDIAGTTYCOMLOWTTY COMLOWLPT COM18-DISK DOCdh lf equ 0ah ff equ 0ch tab equ 09h ; ; parameters for disk ; ; $drvf equ 0 ;first drive to allow ;testing (0=A,1=B,etc) $drvl equ 1 ;last drive to allow ;testing $trkf equ 0 ;first track $trkl equ 39 ;last track $secf equ 0 ;first sector $secl equ 39 ;last sector $bps equ 128 ;bytes per sector $bpt equ 5120 ;bytes per track ; ;number of digits to ;accept in track and ;sector assignments $dig equ 3 ;(should be set larger ; for devices having ; track or sec  tor ; numbers >99 ) ; ; program identification $ver equ 1 ;version $rev equ 1 ;revision (kaypro is rev 1 DmC) ; jp dtst ;enter from CP/M ; global variables for use by all routines ; pass: dw 0 ;current pass number errors: dw 0 ;error count for pass ; ;the following variables ;are used by RDBUF and ;WTBUF to address the ;disk, and by PERR to ;display failing disk ;addresses --- drv: db 0 ;drive to test trk: dw 0 ;current track sec: dw 0 ;current sector buff,dtstb call getyn ;itemize errors? cp 'y' jr z,dtst03 ;yes ld a,1 ;no ld (bypass),a jr dtst04 ;skip query for output ;device, since errors ;will not be listed dtst03: ld de,dtstc ;audit errors on console call getl ;or line printer? cp 'c' jr z,dtst04 ;c=use console cp 'p' call nz,query jr nz,dtst03 ;no match,try again ld a,1 ;p=use line printer ld (list),a dtst04: ld de,dtstd ;lock on read or write? call getl cp 'n' ;n=no locks jr z,dtst06 cp 'r' ;r=loa pattern ; passl: dw 0 ;last pass to do on this ;test run ; digits: db $dig ;maximum number of digits ;to be accepted during ;decimal or hexadecimal ;numeric input. ; xtran: dw sectrb ;address of sector ;translation table ; ; disk test --- main control ; dtst: ;entry from CP/M ld de,dtsta ;print program title ld c,9 call cpm ld hl,(cpm+1) ld de,buffend or a ;make sure enough user sbc hl,de ;memory to execute test jr nc,dtst01 ld de,dtsts ;not ent12 ;too large,try again ld (drv),a ;save drive assignment add a,'A' ;also format for output ld (dtsti1),a ld de,dtsti ;confirm selected drive? call getyn cp 'n' jr z,dtst12 ;not confirmed,try again ; ;initialize track ;limits ld hl,$trkf ld (trkf),hl ld hl,$trkl ld (trkl),hl dtst15: ld de,dtstj ;test all tracks? call getyn cp 'y' ;y=use all of them jr z,dtst20 ;n=user wants to specify ; range of tracks dtst17: ld de,dtstk ;enter first track call getn er: dw 0 ;current memory address iolen: dw 0 ;bytes last transferred ; ;the following variables ;define the area to be ;tested on the selected ;disk drive --- trkf: dw 0 ;first track to test trkl: dw 0 ;last track to test secf: dw 0 ;first sector to test secl: dw 0 ;last sector to test ; ;the following variables ;define the test mode --- ; bypass: db 0 ;0=do not bypass error ;itemization, 1=bypass ;error itemization,print ;total errors per pass ;onlyck on read jr nz,dtst05 ld a,1 ld (lockio),a jr dtst12 ;bypass querys about ;restore mode and ;data pattern: since ;we are locked in read ;mode, they are ;irrelevant. ; dtst05: cp 'w' ;w=lock on write call nz,query jr nz,dtst04 ;no match,try again ld a,2 ld (lockio),a jr dtst08 ;bypass restore question, ;since we are locked in ;write mode. ; dtst06: ld de,dtste ;restore user data? call getyn cp 'y' ;y=restore jr nz,dtst08 ld a,1 ough memory, ld c,9 ;print warning and exit. call cpm jp wboot dtst01: ld c,12 ;check CP/M version call cpm ld a,l ;make sure 2.x and 0f0h cp 20h jr z,dtst02 ld de,dtstz ;not CP/M 2.x, print ld c,9 ;error message and exit call cpm jp wboot dtst02: xor a ;initialize variables ld (bypass),a ld (skew),a ld (list),a ld (lockio),a ld (restor),a ld (lockpt),a ld (pass),a ld (pass+1),a ld (errors),a ld (errors+1),a ;now set up test ;configuration ld de ;to test ld (trkf),hl ;save it ld de,dtstl ;enter last track call getn ;to test ld (trkl),hl ;save it ld de,(trkf) ;make sure first or a ;track<=last track sbc hl,de call c,query ;wrong,start over jr c,dtst17 dtst20: ;initialize sector ;limits ld hl,$secf ld (secf),hl ld hl,$secl ld (secl),hl dtst22: ld de,dtstm ;use all sectors call getyn ;of each track? cp 'y' jr z,dtst26 ;y=use all sectors ;n=user wants to specify ;range of sectors dtst24: ld de. ; skew: db 0 ;0=no sector skew ;1=use sector skew for ; increased test speed ; list: db 0 ;0=print errors on ;terminal, 1=print errors ;on list device. ; lockio: db 0 ;0=no lock ;1=lock on read ;2=lock on write ; restor: db 0 ;0=do not restore original ;data, 1=restore original ;data on diskette ; lockpt: db 0 ;0=use variable test ;data pattern, 1=lock on ;user supplied data pattern ; pattrn: db 0 ;contains user supplied ;8 bit dat ;n=do not restore ld (restor),a dtst08: ld de,dtstf ;lock on data pattern? call getyn cp 'n' jr z,dtst12 ;n=use variable pattern ld a,1 ;y=lock on pattern ld (lockpt),a ;supplied by operator ld de,dtstg ;accept data pattern call geth ;from keyboard ld (pattrn),a dtst12: ld de,dtsth ;select drive to be call getl ;used for test sub 'a' ;convert to logical # cp $drvf ;make sure its legal call c,query jr c,dtst12 ;too small,try again cp $drvl+1 call nc,query jr nc,dts  ,dtstn ;enter first sector call getn ;to test. ld (secf),hl ;save it. ld de,dtsto ;enter last sector call getn ;to test. ld (secl),hl ;save it. ld de,(secf) ;make sure first or a ;sector<=last sector sbc hl,de call c,query jr c,dtst24 ;error,start over ; ;all variables set up ;now --- how many dtst26: ld de,dtstp ;test passes should be call getn ;made? ld (passl),hl ;save # of passes ; ;print advisory message ld de,dtstt ;as test begins ld c,9 c printer? or a jr z,dtst92 ;no,jump ;yes,also send pass ;and error count to ;list device ld hl,dtstr call perr9 dtst92: ;reset error count xor a ld (errors),a ld (errors+1),a ld hl,(pass) ld de,(passl) or a ;are enough passes done? sbc hl,de jp c,dtst40 ;not yet,loop dtst94: ;done with all passes ld de,dtstw ;ask whether to exit call getl ;or to continue test cp 'c' ;c=continue jp z,dtst cp 'e' ;e=exit jr nz,dtst94 ;if no match,try again ld det70 ;yes,jump ;no, compare test data ld hl,buff1 ;written to data read ld de,buff2 ;back from disk. If ld bc,merr4 ;difference found, call bufcmp ;print error message dtst70: ld a,(restor) or a ;using restore mode? jr z,dtst80 ;no,jump ;yes,write back user's ;data ld hl,buff3 ld de,merr6 call wtbuf ld hl,buff1 ;verify that ld de,merr7 ;it was rewritten ok call rdbuf ld hl,buff1 ld de,buff3 ld bc,merr5 ;check restored data call bufcmp ;if difference fou memory addr ld hl,0 ;initialize transfer ld (iolen),hl ;byte count call seldsk ;select disk drive ld hl,(secf) ld (sec),hl ;initialize current sector wtbuf1: call setio ;set track,sector,memory call write ;request disk write or a ;any i/o errors? jr z,wtbuf2 ;no,jump ld de,(wtbufa) call perr ;error, audit it wtbuf2: call rwadv ;advance sector address jr nc,wtbuf1 ;not done,write another ret ;back to caller wtbufa equ rdbufa ;save address of error ;message all cpm ld de,dtstu ;remind user whether he ld a,(restor) ;is using restore or a ;mode jr z,dtst32 ld de,dtstv dtst32: ld c,9 call cpm ; dtst40: ;begin a pass ld hl,(trkf) ld (trk),hl ;initialize current track ; dtst42: ;process next track ld c,6 ;check for interruption ld e,0ffh call cpm ;from console or a jp nz,dtst94 ;break detected,quit ld a,(restor) or a ;is this restore mode? jr z,dtst45 ;no,jump ld hl,buff3 ;yes, save current ld de,merr1 ;d,dtstx ;print goodbye ld c,9 call cpm ;and return control jp wboot ;to CP/M ; ; ; routines to read and write up to one track ; rdbuf: ;read current track from ;secf to secl ; ;call hl=buffer base addr ; de=error msg addr ld (rdbufa),de ;save message address ld (buffer),hl ;save buffer address ld hl,0 ;initialize transfer byte ld (iolen),hl ;count call seldsk ;select disk ld hl,(secf) ld (sec),hl ;initialize current sector rdbuf1: call setio ;send, ;print 'data cannot ;be restored' ; dtst80: ;advance current track ld de,(trk) inc de ld (trk),de ld hl,(trkl) or a ;done with all tracks? sbc hl,de jp nc,dtst42 ;no,process another ; dtst90: ;end of pass ld bc,(pass) inc bc ;count passes ld (pass),bc ld hl,dtstr1 call conv ;convert pass # ld bc,(errors) ld hl,dtstr2 call conv ;convert error count ld de,dtstr ;print pass and errors ld c,9 ;on console call cpm ld a,(list) ;also using ; rwadv: ;advance sector and ;memory addresses ; ld de,$bps ; de <- bytes per sector ld hl,(buffer) add hl,de ;update buffer address ld (buffer),hl ld hl,(iolen) add hl,de ;count bytes transferred ld (iolen),hl ld de,(sec) inc de ;advance current sector ld (sec),de ld hl,(secl) or a ;done with all sectors? sbc hl,de ;exit with carry set if ;done ret ; ; set up buffer with test pattern ; bufpat: ;call hl=address of base ; of buffer isk contents call rdbuf dtst45: ld a,(lockio) cp 1 ;is this lock on read? jr z,dtst47 ;yes,jump ld hl,buff1 ;set up test pattern ld de,$bpt call bufpat ld hl,buff1 ;write test pattern ld de,merr2 call wtbuf dtst47: ld a,(lockio) cp 2 ;is this lock on write? jr z,dtst70 ;yes,jump ld hl,buff2 ;read back test pattern ;(or just read existing ; data if locked on read) ld de,merr3 call rdbuf dtst50: ld a,(lockio) or a ;is this lock on ;read or write? jr nz,dtst up track,sector,memory call read ;now request transfer or a ;was i/o successful? jr z,rdbuf2 ;no error,jump ld de,(rdbufa) call perr ;i/o error, audit it rdbuf2: call rwadv ;advance sector address jr nc,rdbuf1 ;not done,read another ret ;back to caller rdbufa: dw 0 ;address of error message ; wtbuf: ;write current track ;from secf to secl ; ;call de=error msg addr ; hl=buffer base addr ; ld (wtbufa),de ;save message addr ld (buffer),hl ;save   ; de=byte length of ; area to set up ld a,(lockpt) or a ;are we locked on user ;specified data pattern? jr nz,bufpa2 ;yes,jump bufpa1: ld a,r ;read refresh register xor h add a,l ;make data a function of ;memory address ld (hl),a ;and store it inc hl ;advance buffer address dec de ;count bytes stored ld a,d ;done yet? or e jr nz,bufpa1 ;no,loop ret ; user specified pattern bufpa2: ld a,(pattrn) ld (hl),a ;store one bytes error itemization ;bypass flag set? jr nz,perr2 ;yes,skip printing ;and go count errors ld (perra),de ;save message addr. ld bc,(pass) inc bc ld hl,perrc ;convert current pass call conv ld a,(drv) ;form drive name add a,'A' ld (perrd),a ld bc,(trk) ;convert current track ld hl,perre call conv ld bc,(sec) ;convert current sector ld a,(skew) ;is skew in effect? or a jr z,perr0 ;no call sectran ;yes, translate sector perr0: ld hl,perrf call conv ld a,(liste ld de,$bps ;sector number call div ld hl,(secf) add hl,bc ;add relative sector to ;first sector to find ;actual address for use ;by PERR ld (sec),hl ld de,(bufcma) call perr ;now audit error pop hl ;restore registers pop de pop bc bufcm4: ;advance memory address ;out of this sector where ;an error was found. inc hl ;bump buffer addresses inc de dec bc ;done with all data area? ld a,b or c ret z ;yes,exit compare routine ld a,l ;check i ;restore string addr inc hl ;and increment it jr perr9 ;check next char. ; perra: dw 0 ;addr of message ;describing error type perrb: db cr,lf perrc: db 'nnnn ' ;pass # perrd: db 'n ' ;drive perre: db 'nnnn ' ;track perrf: db 'nnnn $' ;sector ; ; ; ; disk interface to CP/M BIOS ; seldsk: ld a,(drv) ;select disk drive ld c,a ld de,24 ;this routine links ;to the desired routine ;through the standard ;CP/M BIOS jump table jpbios: ld hl,(wboot inc hl ;advance buffer address dec de ;count bytes stored ld a,d ;done yet? or e jr nz,bufpa2 ;not done,loop ret ;exit ; ; ; ; compare specified buffer and print error ; message if difference found ; ; bufcmp: ;compare buffers ; ;call bc=address of ; error message ; de=address 1st buffer ; hl=address 2nd buffer ; ld (bufcma),bc ;save msg address ld (bufcmb),hl ;save base of buffer ld bc,(iolen) ;length to compare bufcm1: ld) ;should output be on or a ;console or printer? jr nz,perr3 ;jump,use printer ;fall thru,use console ld hl,(errors) ld a,h ;is this first error? or l jr nz,perr1 ;no,jump ld de,dtstq ;print title for errors ld c,9 call cpm perr1: ld de,perrb ;print disk address ld c,9 call cpm ld de,(perra) ld c,9 ;print error type call cpm ; perr2: ;count errors ld hl,(errors) inc hl ld (errors),hl ret ;back to caller ; perr3: ;errors to printer ld hl,(errf on new sector and $bps-1 ;boundary jr z,bufcm1 ;found it, go compare ;more data jr bufcm4 ;keep advancing until ;sector boundary. ; bufcma: dw 0 ;address of error message bufcmb: dw 0 ;base buffer address ; ; perr: ;error printing routine, ;prints pass,drive,track, ;sector, and message ;specified by caller on ;console or list device. ; ; call with de=address ; of message giving ; type of error ; ld a,(bypass) or a ;i+1) add hl,de jp (hl) ; settrk: ld bc,(trk);select track ld de,27 jr jpbios ; setsec: ld bc,(sec);select sector ld de,30 ld a,(skew);use sector skew? or a jr z,jpbios;no call sectran ;translate sector addr. jr jpbios ; setdma: ld bc,(buffer) ;set memory addr. ld de,33 jr jpbios ; setio: call settrk ;set up track,sector, call setsec ;and memory address call setdma ;for subsequent read ret ;or write ; read: ;read one disk sector ld de,36 jr jpbios ; write: ;w a,(de) ;fetch byte from 1st buffer cp (hl) ;compare it to 2nd buffer jr nz,bufcm3 ;difference found,jump bufcm2: inc hl ;advance buffer addresses inc de dec bc ;count bytes ld a,b ;done yet? or c jr nz,bufcm1 ;no,loop ret ;back to caller ; bufcm3: ;difference found, print ;error audit trail push bc ;first save registers push de push hl ld de,(bufcmb) or a sbc hl,de ;find a buffer offset push hl ;now divide by bytes per pop bc ;sector to find relativors) ld a,h ;is this 1st error to or l ;be printed this pass? jr nz,perr4 ;no,jump ld hl,dtstq ;yes,print title call perr9 perr4: ld hl,perrb ;print disk address call perr9 ld hl,(perra) call perr9 ;print error type jr perr2 ;go count errors ; perr9: ;send a string ;terminated by '$' ;to list device ld a,(hl) ;fetch next char cp '$' ;is it terminator? ret z ;yes,exit push hl ;save string addr. ld e,a ;send this character ld c,5 call cpm pop hl   rite one disk sector ld de,39 jr jpbios ; sectran: ;translate logical to ;physical sector number ; ;call bc=logical sector ;return bc=physical sector push hl ld hl,sectrb-1 add hl,bc ld c,(hl) pop hl ret sectrb: db 1,2,3,4,5,6,7,8,9 ; ; messages for test initialization and ; error printing ; dtsta: db cr,lf,lf db 'Z80 Disk Diagnostic ' db 'Test version ' db $ver+'0','.' db $rev+'0',cr,lf db ' Modified for the Kaypro 2 ',cr,lf db ' By Micro Cornucopia ;get y or n response ;from operator. ; ;call de=address of cue ;return acc=y or n push de ;save cue address ld c,9 ;print cue message call cpm ld de,getyna ld c,9 ;print possible answers call cpm call getchar ;get a character ;from console or 20h ;fold to lower case pop de ;restore cue address ;in case needed again cp 'y' ;make sure response ;is ok ret z ;exit if y cp 'n' ret z ;exit if n push de call query ;print question mark if r-type' db cr,lf,'$' dtstr: db cr,lf,lf,'Pass ' dtstr1: db 'nnnn complete, ' dtstr2: db 'nnnn errors.' db cr,lf,'$' dtsts: db cr,lf,'Not enough ' db 'memory to execute.' db cr,lf,'$' dtstt: db cr,lf,lf,'Beginning ' db 'disk test - push ' db 'any key to abort ' db 'program.',cr,lf,'$' dtstu: db 'Warning: user ' db 'data will not be ' db 'restored.',cr,lf,'$' dtstv: db 'User data will be ' db 'restored.',cr,lf,'$' dtstw: db cr,lf,'Continue or ' db 'exit test? (C/E)$' dtstx: db clegal char.? jr c,getn3 ;no, jump cp '9'+1 ;is this legal char.? jr nc,getn3 ;no,jump and 0fh ;isolate bottom 4 bits ;previous data * 10 push hl pop de add hl,hl ;(*2) add hl,hl ;(*4) add hl,de ;(*5) add hl,hl ;(*10) ld e,a ;now add in this digit ld d,0 add hl,de djnz getn1 ;count characters accepted jr getn9 ;enough accepted,exit getn3: ;illegal character detected. call query ;print question mark and pop de ;restart input jr getn getn9: ;input coMagazine',cr,lf,lf db 'Original Version ' db '(c) 1980 Laboratory ' db 'Microsystems',cr,lf,'$' dtstb: db cr,lf,'Itemize ' db 'errors? $' dtstc: db cr,lf,'Use ' db 'console or printer' db '? (C/P) $' dtstd: db cr,lf,'Lock on read ' db 'or write? (N/R/W) $' dtste: db cr,lf,'Restore ' db 'original data? $' dtstf: db cr,lf,'Lock on ' db 'data pattern? $' dtstg: db cr,lf,'Enter data ' db 'pattern, hex 00-FF$' dtsth: db cr,lf,'Drive ' db 'to be tested ' db '(',$drvf+'A','-' dbpop de ;not y or n, try again jr getyn ; getyna: db '(Y/N) ',tab,'> $' ; ; getl: ;get any letter response ;from operator. ; ;call de=address of cue ;return acc=ASCII char. ld c,9 ;print cue message call cpm ld de,getla ;tab and print ld c,9 ;cue mark call cpm call getchar ;read console or 20h ;fold to lower case ret getla: db tab,'> $' ; ; getn: ;get a decimal number ;from the console. ; ;call de=address of cue ;return hl=numberr,lf,lf db 'Goodbye.',cr,lf,'$' dtsty: db cr,lf,'Use sector ' db 'skew? $' dtstz: db cr,lf,'Need CP/M 2.x ' db 'to execute.',cr,lf,'$' merr1: db 'read error - original data$' merr2: db 'write error - test pattern$' merr3: db 'read error - test pattern$' merr4: db 'compare error - test pattern$' merr5: db 'original data cannot ' db 'be restored$' merr6: db 'write error - restore phase$' merr7: db 'read error - restore phase$' ; ; ; ; utility and console input routines ; getyn: mplete,clean ;stack and exit with ;answer in (hl) pop de ret getna: db tab,'> $' getnb: db '?$' ; ; geth: ;get $dig hex digits ;from keyboard ; ;call de=addr of cue ;return acc=lower 8 bits ; of entered number, ; hl=entire 16 bit no. ; push de ;save cue address ;in case needed again ld c,9 call cpm ;print cue message ld de,getha ;print tab and cue mark ld c,9 call cpm ld hl,0 ;initialize forming ;answer ld a,(digi $drvl+'A',') $' dtsti: db cr,lf,'Confirm: test drive ' dtsti1: db 'X ? $' dtstj: db cr,lf,'Test all ' db 'tracks? $' dtstk: db cr,lf,'First ' db 'track to test $' dtstl: db cr,lf,'Last ' db 'track to test $' dtstm: db cr,lf,'Test all ' db 'sectors? $' dtstn: db cr,lf,'First ' db 'sector to test $' dtsto: db cr,lf,'Last ' db 'sector to test $' dtstp: db cr,lf,'How many ' db 'test passes? $' dtstq: db cr,lf,lf,'Pass ' db 'Drive Track ' db 'Sector Erro push de ;save cue message address ;in case needed later ld c,9 call cpm ;print cue message ld de,getna ;print tab and cue mark ld c,9 call cpm ld hl,0 ;initialize forming ;answer ld a,(digits) ld b,a ;total characters allowed ;to be input getn1: push hl ;save answer push bc ;save char. count call getchar ;read console pop bc ;restore char. count pop hl ;restore forming answer cp cr ;is this return? jr z,getn9 ;yes,exit with answer cp '0' ;is this   ts) ld b,a ;max digits to accept geth1: push bc ;save registers push hl call getchar ;read console pop hl pop bc ;restore registers cp cr ;if carriage return exit jr z,geth25 cp '0' ;make sure its legal jr c,geth3 ;no,jump cp '9'+1 ;if alpha fold to jr c,geth15 ;lower case or 20h geth15: cp 'f'+1 ;make sure its legal jr nc,geth3 ;no,jump cp 'a' ;check if alpha jr c,geth2 ;jump if 0-9 add a,9 ;add correction geth2: and 0fh add hl,hl ;previous data *16 add irst byte addr ; to store output ; ld de,1000 call div call conv9 ;thousands digit ld de,100 call div call conv9 ;hundreds digit ld de,10 call div call conv9 ;tens digit call conv9 ;units ret ;back to caller conv9: ld a,c ;turn quotient into add a,'0' ;ASCII character ld (hl),a ;and store it inc hl ;bump output pointer push de ;bc <- remainder pop bc ret ; ; div: ;single precision divide ;call bc=numerator ; de=divisor ;returnnnn n nnnn nnnn $:O*KK :(aK !)2D$'!h N Z80 Disk Diagnostic Test version 1.1 Modified for the Kaypro 4 By Micro Cornucopia Magazine Original Version (c) 1980 Laboratory Microsystems $ Itemize errors? $ Use console or printer? (C/P) $ Lock on read or write? (N/R/W) $ Restore original data? $ Lock on data pattern? $ Enter data pattern, hex 00-FF$ Drive to be tested (A-B) $ Confirm: test drive X ? $ Test all trachl,hl ;(left shift 4 bits) add hl,hl add hl,hl add a,l ;add this char. to ld l,a ;forming result djnz geth1 ;keep reading console geth25: pop de ;clean up stack ld a,l ;put lower 8 bits ;of answer in acc. ;(in case exit by ; carriage return) ret geth3: call query ;print question mark pop de ;then restart input jr geth getha: db tab,'> $' ; ; query: push af ;save flags ld c,9 ;print question mark ld de,querya call cpm pop af ;restore flags ret qu$ir *R0   } (  2222222222 y(>2$ c( pĘ >2E n(r >25wĘ >2g y >2 n(>2M 2 aܘ 8Ԙ 02A2 n(!"!O" y( "$ "[Rܘ 8!"!'"? y(W "r "[Rܘ 8 " W:( *"m:( !` ͇:(!! ͵:(!86 ͇: !8P :(!`n bc=quotient ; de=remainder push hl ld hl,0 or a sbc hl,de ex de,hl ld hl,0 ld a,17 div0: push hl add hl,de jr nc,div1 ex (sp),hl div1: pop hl push af rl c rl b rl l rl h pop af dec a jr nz,div0 or a rr h rr l ex de,hl pop hl ret ; ; buff1 equ 1000h ;disk buffers buff2 equ $bpt*2+buff1 buff3 equ $bpt*2+buff2 buffend equ $bpt*2+buff3 ; ; end ks? $ First track to test $ Last track to test $ Test all sectors? $ First sector to test $ Last sector to test $ How many test passes? $ Pass Drive Track Sector Error-type $ Pass nnnn complete, nnnn errors. $ Not enough memory to execute. $ Beginning disk test - push any key to abort program. $Warning: user data will not be restored. $User data will be restored. $ Continue or exit test? (C/E)$ Goodbye. $ Use sector skew? $ Need CP/M 2.x to execute. $erya: db ' ?$' ; ; getchar: ;get 1 character from ;console via raw input ;mode. do not echo a ;carriage return. ld e,0ffh ld c,6 call cpm ;read console or a ;anything there? jr z,getchar ;no,try again cp cr ;is it a carriage return? ret z ;yes push af ;no,echo it ld e,a ld c,6 call cpm pop af ;restore acc. and exit ret ; ; conv: ;convert binary to ;decimal ascii ; ;call bc=binary data, in ; range 0000-9999. ; hl=f ͵! ͇!`m [S*RҡKC!ͼ K!ͼ  :(!22*[Rڛ c$e  S" !"*" MW([j0S" !"*" M\([j0* " *"[ S *R: _w#z :w#z Cf"hK # x [hR * " [fj# x}(: ZSK!ͼ :A2K!ͼ K :(a!ͼ : (*|   [ *#"*| !!*~$_#   read error - original data$write error - test pattern$read error - test pattern$compare error - test pattern$original data cannot be restored$write error - restore phase$read error - restore phase$   ͦ yn͘ (Y/N) > $   ͦ > $ G  !:!Gͦ (08:0)))_͘  > $?$   !:!Gͦ (08:8 g0a8 ))))o}͘  > $   ?$( _ d  y0w#!R!>0ks? $ First track to test $ Last track to test $ Test all sectors? $ First sector to test $ Last sector to test $ How many test passes? $ Pass Drive Track Sector Error-type $ Pass nnnn complete, nnnn errors. $ Not enough memory to execute. $ Beginning disk test - push any key to abort program. $Warning: user data will not be restored. $User data will be restored. $ Continue or exit test? (C/E)$ Goodbye. $ Use sector skew? $ Need CP/M 2.x to execute. $ ͵! ͇!`m [S*RҡKC!ͼ K!ͼ  :(!22*[Rڛ c$e  S" !"*" MW([j0S" !"*" M\([j0* " *"[ S *R: _w#z :w#z Cf"hK # x [hR * " [fj# x}(: ZSK!ͼ :A2K!ͼ K :(a!ͼ : (*|   [ *#"*| !!*~$_#  .Z80 ASEG ;*********************************************************************** ; MICROCOSM ASSOCIATES "SUPER MEMORY DIAGNOSTIC" VERSION 1.01 (C) 1979 ;*********************************************************************** ; ;DONATED TO THE "SIG/M" CP/M USER'S GROUP BY: ;KELLY SMITH, MICROCOSM ASSOCIATES ;3055 WACO AVENUE ;SIMI VALLEY, CALIFORNIA, 93065 ;(805) 527-9321 (MODEM, CP/M-NET (TM)) ;(805) 527-0518 (VERBAL) ; TRUE EQU 0FFFFH FALSE EQU 0000H CR EQU 0DH LF EQU 0AH ; ORG 0100= }͘  > $   ?$( _ d  y0w#!R!>0read error - original data$write error - test pattern$read error - test pattern$compare error - test pattern$original data cannot be restored$write error - restore phase$read error - restore phase$   ͦ yn͘ (Y/N) > $   ͦ > $ G  !:!Gͦ (08:0)))_͘  > $?$   !:!Gͦ (08:8 g0a8 ))))o}͘  > $   ?$( _ d  y0w#!R!>0nnnn n nnnn nnnn $:O*KK :(aK !)2D$'!h N Z80 Disk Diagnostic Test version 1.1 Modified for the Kaypro 2 By Micro Cornucopia Magazine Original Version (c) 1980 Laboratory Microsystems $ Itemize errors? $ Use console or printer? (C/P) $ Lock on read or write? (N/R/W) $ Restore original data? $ Lock on data pattern? $ Enter data pattern, hex 00-FF$ Drive to be tested (A-B) $ Confirm: test drive X ? $ Test all tracH ; ; ; DI ;DISABLE INTERRUPTS LD SP,STACK ;SET THE STACK POINTER JP INIT ;INITIALIZE ; ; ; ; ; ; ; ; ;SUBROUTINE TO CONVERT TWO HEX CHARACTERS TO ONE BYTE ; NBL: SUB '0' RET C ADD A,0E9H RET C ADD A,6 JP P,NIO ADD A,7 RET C NIO: ADD A,10 OR A RET ; ; ; ;SUBROUTINE TO CONVERT A BYTE TO TWO HEX CHARACTERS ; LBYTE: PUSH AF RRCA RRCA RRCA RRCA AND 0FH CALL HXDA POP AF AND 0FH JP HXDA ; ; ; HXDA: CP 10 JP M,CNO ADD A,7 CNO: ADD A,30$ir *R0   } (  2222222222 y(>2$ c( pĘ >2E n(r >25wĘ >2g y >2 n(>2M 2 aܘ 8Ԙ 02A2 n(!"!'" y( "$ "[Rܘ 8!"!'"? y(W "r "[Rܘ 8 " W:( *"m:( !` ͇:(!! ͵:(!86 ͇: !8P :(!`= }͘  > $   ?$( _ d  y0w#!R!>0  H LD C,A JP CO ; ; ; ;CONSOLE INPUT ROUTINE CI: IN A,(07H) AND 1 JP Z,CI IN A,(05H) AND 7FH RET ; ; ; CRLF: LD C,0DH CALL CO LD C,0AH JP CO ; ; ; CONO: CALL BYTEO CALL CRLF RET ; ; ; CONI: PUSH BC CALL BYTEC POP BC RET ; ; ; ;CONSOLE OUTPUT ROUTINE ; CO: IN A,(1CH) AND 8 JP Z,CO LD A,C OUT (08H),A COOP: PUSH AF IN A,(1CH) OR 10H OUT (1CH),A AND 0EFH OUT (1CH),A POP AF RET ; ; INIT: IN A,(1CH) SET 6,A OUT (1CH),A  ; ; MEM: LD HL,MSG1 ;OUTPUT "MEMORY ADDRESS=" TO CONSOLE CALL MSG CALL PARAM MEM1: CALL DSPYM CALL CECHO CP 00DH JP Z,MNTR CP 020H JP Z,MEM9 CP 05EH JP Z,MEM10 CALL BYTC1 LD (HL),A CP (HL) JP Z,MEM9 LD C,' ' CALL CO LD C,'E' CALL CO MEM9: INC HL JP MEM1 MEM10: DEC HL JP MEM1 ; ; ; ;KEY-BOARD INTERRUPT ROUTINE,KEYED WITH "SPACE-BAR" ; KBINT: IN A,(07H) AND 1 RET Z IN A,(05H) AND 07FH ;MASK-OFF PARITY BIT CP 020H ;GOT A "SPACE-BAR"? JP Z,MNTR ;JP Z,MEMTS ;JUMP TO MEMORY TEST START,IF "T" LER: CALL CRLF ;KEEP IT NEAT LD C,'?' ;LINE INPUT ERROR,OUTPUT "?" TO CONSOLE CALL CO JP MNTR ; ; ; CECHO: CALL CI LD C,A CALL CO RET ; ; ; GO: LD HL,MSG2 ;OUTPUT "GO ADDRESS=" TO CONSOLE CALL MSG CALL PARAM CALL CRLF JP (HL) ; ; ; PARAM: LD HL,0 PARM1: CALL CECHO CP 0DH RET Z ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL JP C,LER CALL NBL JP C,LER OR L LD L,A JP PARM1 ; ; ; BYTEC: CALL CECHO BYTC1: CA ; CLMSG: DEFB 26,CR,LF,'GALLOPING COLUMNS TEST',CR,LF ; RDMSG: DEFB 24,CR,LF,'RANDOM PATTERNS TEST',CR,LF ; SATSG: DEFB 25,CR,LF,'WRITE SATURATION TEST',CR,LF ; WMSG: DEFB 25,CR,LF,'WALKING PATTERNS TEST',CR,LF ; NDMSG: DEFB 28,CR,LF,'NO MEMORY BLOCKS DROPPED',CR,LF ; DMMSG: DEFB 28,CR,LF,'DROPPED MEMORY BLOCK(S)=',CR,LF ; LMMSG: DEFB 23,CR,LF,'LOW MEMORY ADDRESS=',CR,LF ; HMMSG: DEFB 24,CR,LF,'HIGH MEMORY ADDRESS=',CR,LF ; NAMSG: DEFB 26,CR,LF,'INVALID MEMORY ADDRESS',CR,LF ; OPMSG: DEF LD HL,01000H ;SET DELAY COUNT FOR 6850 SETTLE TIME DELAY: DEC HL LD A,H OR L JP NZ,DELAY LD HL,MSGN CALL MSG TOP: LD HL,MSG7 ;OUTPUT "TOP OF MEMORY=" TO CONSOLE CALL MSG LD HL,00FFFH ;SET BASE ADDRESS OF TEST RAM -1 FIND: INC HL ;EXAMINE EACH BYTE LD A,H OR A JP Z,FIND1 LD A,(HL) CPL LD (HL),A CP (HL) JP Z,FIND FIND1: DEC HL CALL HLOUT LD HL,QTMSG ;OUTPUT "MEMORY QUALIFICATION TEST ; IS IN PROGRESS" TO CONSOLE CALL MSG LD HL,01000H ;SET MEMORY "BOTTOM" AGO TO COMMAND MONITOR,IF SO RET ; ; ; SP5: LD C,20H CALL CO SP4: LD C,20H CALL CO SP3: LD C,20H CALL CO SP2: LD C,20H CALL CO SP1: LD C,20H CALL CO RET ; ; ; ; ; ; MSGN: DEFB 73,CR,LF,'MICROCOSM ASSOCIATES "SUPER MEMORY DIAGNOSTIC"' DEFB ' VERSION 1.01 (C) 1979',CR,LF ; MSG1: DEFB 14,'EMORY ADDRESS=' ; MSG2: DEFB 10,'O ADDRESS=' ; MSG7: DEFB 18,CR,LF,'TOP OF MEMORY=',CR,LF ; QTMSG: DEFB 44,CR,LF,'MEMORY QUALIFICATION TEST IS IN PROGRESS',CR,LF ; AMMSG: DEFB 40,CRLL NBL JP C,LER RLCA RLCA RLCA RLCA PUSH AF CALL CECHO CALL NBL JP C,LER POP BC OR B RET ; ; ; BYTEO: PUSH AF CALL BYTO1 LD C,A CALL CO POP AF CALL BYTO2 LD C,A JP CO BYTO1: RRCA RRCA RRCA RRCA BYTO2: AND 0FH CP 0AH JP M,BYTO3 ADD A,7 BYTO3: ADD A,30H RET ; ; ; HLCO: CALL CRLF HLOUT: LD A,H CALL BYTEO LD A,L CALL BYTEO RET ; ; ; DSPYM: CALL HLCO LD C,'=' CALL CO LD A,(HL) CALL BYTEO LD C,20H CALL CO RET ; B 21,CR,LF,'TEST OPTIONS ARE:',CR,LF ; TMSG1: DEFB 30,CR,LF,'01-GALLOPING PATTERNS TEST',CR,LF ; TMSG2: DEFB 27,'02-GALLOPING COLUMNS TEST',CR,LF ; TMSG3: DEFB 26,'03-WALKING PATTERNS TEST',CR,LF ; TMSG4: DEFB 25,'04-RANDOM PATTERNS TEST',CR,LF ; TMSG5: DEFB 26,'05-WRITE SATURATION TEST',CR,LF ; TMSG6: DEFB 28,'06-STATIC CHECK CYCLE TEST',CR,LF ; TMSGN: DEFB 45,CR,LF,'ENTER TEST NUMBER (01,02,03,04,05 OR 06)=',CR,LF ; EPMSG: DEFB 25,CR,LF,'ENTER PATTERN(00-FF)=',CR,LF ; REMSG: DEFB 29,CR,LDDRESS LD (MBOT),HL LD HL,0F000H ;SET MEMORY "TOP" ADDRESS LD (MTOP),HL LD HL,TEST ;SAVE "FUNKY RETURN" ADDRESS LD (MTEST),HL JP RNDSL ;GO DO RANDOM PATTERNS TEST ON 16K BYTE MEMORY TEST: LD SP,STACK ;RE-SET THE STACK JP MEMTS ; ; ; MNTR: LD SP,STACK CALL CRLF LD C,'-' ;OUTPUT PROMPT (- CHARACTER) CALL CO CALL CECHO ;ECHO KEY-BOARD INPUT OUT TO CONSOLE CP 'M' JP Z,MEM ;JUMP TO MEMORY DISPLAY/ALTER,IF "M" CP 'G' JP Z,GO ;JUMP TO GO TO MEMORY ADDRESS,IF "G" CP 'T' ,LF,'TEST MEMORY IN "AUTO" MODE (Y OR N)?',CR,LF ; DFMSG: DEFB 48,CR,LF,'TEST "ALL","SELECT",OR "MONITOR" (A,S OR M)?',CR,LF ; TPMSG: DEFB 22,CR,LF,' TEST IS IN PROGRESS' ; TMSG: DEFB 18,CR,LF,'TESTING MEMORY',CR,LF ; FMSG: DEFB 6,',FROM ' ; TOMSG: DEFB 4,' TO ' ; PSMSG: DEFB 7,CR,LF,'PASS=' ; ERMSG: DEFB 15,', TOTAL ERRORS=' ; PTSG: DEFB 27,CR,LF,'GALLOPING PATTERNS TEST',CR,LF ; RFMSG: DEFB 27,CR,LF,'STATIC CHECK CYCLE TEST',CR,LF ; CKMSG: DEFB 27,CR,LF,'CHECKING DATA RETENTION',CR,LF   F,'RETENTION ERROR AT ADDRESS=',CR,LF ; EXMSG: DEFB 33,CR,LF,'EXPECTED "00" DATA,READ BACK ',CR,LF ; MRER1: DEFB 22,CR,LF,'ERROR AT ADDRESS=',0,CR,LF ; MRER2: DEFB 12,' READ BACK ' ; MRER3: DEFB 11,' ,EXPECTED ' ; MRER4: DEFB 27,'LAST ADDRESS WRITTEN WAS ',CR,LF ; MRER5: DEFB 14,20H,',PATTERN WAS ' ; MRER6: DEFB 26,'ERROR READING OTHER CELL',CR,LF ; MRER7: DEFB 25,'ERROR READING TEST CELL',CR,LF ; MRER8: DEFB 12,'TEST CELL=',CR,LF ; MRER9: DEFB 13,', OTHER CELL=' ; MER10: DEFB 18,20H,OCK POINTER DEC HL ;BACK-UP TO MEMORY BLOCK JUST TESTED,AND LOG IT OUT LD (HL),000H AUTO3: LD A,9 ;SET ERROR DISPLAY COUNTER TO 8 PLUS 1 LD (ERCNT),A XOR A ;CLEAR ERROR FLAG LD (ERFLG),A LD HL,(MEMPT) ;GET MEMORY BLOCK AND BLOCK NUMBER LD A,(HL) INC HL ;UPDATE AND SAVE NEW POINTER LD (MEMPT),HL OR A ;TEST THE MEMORY BLOCK NUMBER JP M,AUTO0 ;RE-START IF "END" OF BUFFER JP Z,AUTO3 ;TRY NEXT ONE,IF DROPPED MEMORY BLOCK RLCA ;CONVERT MEMORY BLOCK NUMBER TO 4K BLOCK ADDRESS ERATOR SELECT,IF NO JP AUT ;OOPS...GAVE HIM TWO CHOICES,AND HE PICKED THIRD AUTO: CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT LD HL,DROP ;SET-UP DROP LIST POINTER LD (DROPP),HL ;SET DROP LIST POINTER TO START XOR A ;CLEAR DROP COUNT AND ERROR FLAG DEC HL LD (HL),A DEC HL LD (HL),A AUTO0: LD HL,MBUF ;POINT TO MEMORY BUFFER LD (MEMPT),HL ;SAVE MEMORY POINTER FOR LOOPING AUTO1: LD A,(ERFLG) ;GET ERROR FLAG,TO SEE IF WE DROP MEMORY ; BLOCK JUST TESTED OR NOT OR A JP Z,AUTO3 ;IF ATURATION TEST IN "AUTO MODE" ; WRTSAT: LD SP,STACK ;SET THE STACK POINTER LD HL,SATSG ;OUTPUT "WRITE SATURATION TEST" TO CONSOLE CALL MSG LD HL,(BLKST) ;GET MEMORY BLOCK STARTING ADDRESS LD (MBOT),HL ;SAVE AS MEMORY BOTTOM ADDRESS LD HL,(MEND) ;GET MEMORY BLOCK END ADDRESS LD (MTOP),HL ;SAVE A MEMORY "TOP" ADDRESS LD B,100 ;SET-UP FOR 100 WRITE SATURATION PASSES XOR A ;SATURATE WITH 0'S FIRST CALL SAT ;WRITE WITH PATTERN,100 TIMES LD A,0FFH ;FLIP PATTERN TO 1'S CALL BAKPT ;WRIT20H,'PATTERN STORED=',0 ; MER11: DEFB 16,20H,20H,'PATTERN READ=',0 ; MER12: DEFB 19,'BIT(S) IN ERROR=',CR,LF,0 ; ; ; ; ; MSG: PUSH AF PUSH BC LD B,(HL) INC HL MSGA: LD C,(HL) CALL CO INC HL DEC B JP NZ,MSGA POP BC POP AF RET ; ; ; ; ; ; ;ROUTINE TO FIND ALL 4K MEMORY BLOCKS AVAILABLE TO SYSTEM ; MEMTS: LD HL,00000H ;CLEAR THE PASS AND ERROR COUNTERS LD (PCTR),HL LD (ECTR),HL LD BC,MBUF ;POINT TO MEMORY BUFFER LD E,1 ;SET-UP BASE RAM 1ST 4K BYTE TEST ADDRESS RLCA RLCA RLCA LD L,000H ;ZERO L REG. LD H,A ;MAKE A 16 BIT BLOCK ADDRESS OUT OF THIS, ; AND SAVE AS BLOCK STARTING ADDRESS LD (BLKST),HL ADD A,010H ;ADD 4K TO START LD H,A LD (MEND),HL ;SAVE AS MEMORY BLOCK END ADDRESS +1 LD HL,AUTO1 ;SAVE "AUTO1" FOR LOOPING ADDRESS LD (AUTOR),HL LD HL,TMSG ;OUTPUT "TESTING MEMORY " TO CONSOLE CALL MSG LD HL,FMSG ;OUTPUT ", FROM " TO CONSOLE CALL MSG LD HL,(BLKST) ;GET THE MEMORY BLOCK STARTING ADDRESS CALL HLOUT LD HL,TOMSG ;NOT ZERO,DROP THIS BLOCK FROM TEST LD HL,(DROPP) ;POINT TO NEXT DROP LIST SLOT EX DE,HL LD HL,(BLKST) ;GET MEMORY BLOCK START ADDRESS EX DE,HL ;AND NOW WE HAVE H&L REGS.AS DROP LIST POINTER, ; AND D&E REGS. AS THE BLOCK START LD (HL),E ;SAVE LOW BYTE OF BLOCK START INC HL LD (HL),D ;SAVE HIGH BYTE OF BLOCK START INC HL ;GET H&L REGS. TO POINT TO NEXT DROP LIST SLOT LD (DROPP),HL ;SAVE THE NEW POINTER LD HL,DROPC ;+1 TO THE DROP COUNT INC (HL) LD HL,(MEMPT) ;GET THE MEMORY BLE 1 TIME ONLY CALL SATRD ;DO SATURATION READ LD B,100 ;AGAIN SET-UP 100 WRITE SATURATION PASSES LD A,0FFH ;NOW SATURATE WITH 1'S CALL SAT ;WRITE WITH PATTERN,100 TIMES XOR A ;FLIP PATTERN TO 0'S CALL BAKPT ;WRITE 1 TIME ONLY CALL SATRD ;DO SATURATION READ JP GAL ;GO DO "GALLOPING PATTERNS" MEMORY TEST ; ; ; ;ROUTINE TO DO WRITE SATURATION TEST IN "SELECT MODE" ; WSATT: LD B,100 ;SET-UP FOR 100 WRITE SATURATION PASSES CALL SAT ;WRITE WITH SELECTED PATTERN,100 TIMES CPL ; STAAD: LD A,E LD (BC),A ;SAVE IT IN BUFFER INC BC INC4K: LD A,00BH ;INCREMENT TO NEXT 4K MEMORY BLOCK,STOP IF ALL ; MEMORY BLOCKS TRIED,FOR 16 K BYTE MEMORY INC E ;BUMP FOR NEXT MEMORY BLOCK CP E ;ALL DONE? JP P,STAAD ;IF NOT,GO TEST THIS NEW MEMORY BLOCK LD A,080H ;YES,TAG WITH "END" IN BUFFER LD (BC),A AUT: LD HL,AMMSG ;OUTPUT "TEST MEMORY IN "AUTO" MODE (Y OR N)?" CALL MSG CALL CECHO ;GET THE ANSWER CP 'Y' JP Z,AUTO ;DO AUTO MODE,IF YES CP 'N' JP Z,SELCT ;LET OPOUTPUT " TO " TO CONSOLE CALL MSG LD HL,(MEND) ;GET THE MEMORY ENDING ADDRESS CALL HLOUT LD HL,PSMSG ;OUTPUT "PASS=" TO CONSOLE CALL MSG LD HL,(PCTR) ;GET THE PASS COUNTER,AND UPDATE IT INC HL LD (PCTR),HL CALL HLOUT LD HL,ERMSG ;OUTPUT ", ERRORS TOTAL=" TO CONSOLE CALL MSG LD HL,(ECTR) ;GET THE ERROR COUNTER,AND SHOW IT ALSO CALL HLOUT LD HL,WRTSAT ;SAVE "NEXT TEST" ADDRESS LD (MTEST),HL JP RANPT ;GO DO RANDOM PATTERNS MEMORY TEST ; ; ; ;ROUTINE TO DO WRITE AMPLIFIER S  WRITE WITH COMPLEMENT,1 PASS CALL BAKPT CALL SATRD ;READ THE DATA LD A,(TPATT) ;GET SAVED TEST PATTERN LD B,100 ;NOW DO COMPLEMENT 100 TIMES CALL SAT ;....AND WE'RE OFF CPL ;WRITE WITH COMPLEMENT,1 PASS CALL BAKPT CALL SATRD ;READ THE DATA RET ; ; ; ;SUBROUTINE TO READ 1 PASS "BACKGROUND" PATTERN AS CONTAINED IN A REG. ; SATRD: LD HL,(MTOP) ;GET MEMORY "TOP" ADDRESS EX DE,HL ;SWAP H&L REGS. TO D&E REGS. LD HL,(MBOT) ;TOP'S IN D&E REGS.,BOTTOM'S IN H&L REGS. LD B,A ;SAVUTPUT "GALLOPING PATTERN MEMORY TEST" TO CONSOLE CALL MSG LD HL,(BLKST) ;GET MEMORY BLOCK STARTING ADDRESS GAL1: LD (MBOT),HL ;SAVE AS "CHUNK" START INC H ;ADD 256 LD L,000H ;CLEAN-UP L REG. LD (MTOP),HL ;SAVE AS "CHUNK" END +1 LD A,0FFH ;ALL ONES BACK-GROUND PATTERN CALL GALPT ;TEST THE "CHUNK" WITH 1'S XOR A ;ALL ZEROS BACK-GROUND PATTERN CALL GALPT ;TEST THE "CHUNK" WITH 0'S LD HL,(MEND) ;GET "CHUNK" AND MEMORY BLOCK END CALL COMP ;HAVE WE DONE ALL 16 "CHUNKS" IN THE MEMORY ROR AT ADDRESS=" TO CONSOLE CALL MSG POP HL ;GET BAD BYTE ADDRESS,BUT DON'T ; CHANGE THE STACK PUSH HL CALL HLOUT LD HL,MRER2 ;OUTPUT " READ BACK " TO CONSOLE CALL MSG LD A,(ERPAT) ;GET ERROR PATTERN CALL BYTEO ;SHOW IT LD HL,MRER3 ;OUTPUT " , EXPECTED " TO CONSOLE JP SATX ;DISPLAY EXPECTED DATA PATTERN AND EXIT ; ; ; ;ROUTINE TO DO STATIC CHECK CYCLE TEST IN "SELECT MODE" ; STATT: LD A,0FFH ;ALL 1'S PATTERN FOR FIRST PORTION OF TEST PUSH AF ;SAVE THE PATTERN CALL BAKPTP ALL ONES PATTERN CALL GALCL ;DO "GALLOPING COLUMN" XOR A ;SET-UP ALL ZEROS PATTERN CALL GALCL ;TEST THE MEMORY BLOCK AGAIN ; ; ; ;ROUTINE TO WALK PATTERNS THRU THE MEMORY BLOCK IN 256 BYTE "CHUNKS", ; (WRITES 1'S,WALKS 0'S,THEN WRITES 0'S,AND THEN WALKS 1'S) ; WALK: LD HL,WMSG ;OUTPUT "WALKING PATTERNS MEMORY TEST" TO CONSOLE CALL MSG LD HL,(BLKST) ;GET MEMORY BLOCK STARTING ADDRESS WALK1: LD (MBOT),HL ;SAVE AS "CHUNK" STARTING ADDRESS INC H ;ADD 256 LD L,000H ;SCRUB L REG. E PATTERN IN B REG. LD (TPATT),A ;SAVE DATA PATTERN FOR POSSIBLE ERROR DISPLAY FSTRD: CALL COMP ;ALL DONE? RET Z LD A,(HL) ;GET A BYTE FROM MEMORY CP B ;GOT A MATCH? CALL NZ,SATER ;INDICATE "WRITE SATURATION" ERROR IF NO MATCH INC HL ;BUMP POINTER FOR NEXT BYTE JP FSTRD ;DO FAST READ ON MORE MEMORY ; ; ; SAT: PUSH AF ;EXILE THE A REG. CALL KBINT ;CHECK KEY-BOARD INTERRUPT POP AF ;BACK FROM EXILE PUSH BC ;SAVE PASSES ON STACK CALL BAKPT ;WRITE THE "BACKGROUND" PATTERN PBLOCK? JP Z,STATIC ;IF DONE,GO DO 1 MINUTE STATIC TEST EX DE,HL ;OH...GO DO NEXT "CHUNK" IN SAME MEMORY BLOCK JP GAL1 ; ; ; STATIC: LD HL,RFMSG ;OUTPUT "STATIC CHECK CYCLE" TO CONSOLE CALL MSG LD BC,500 CALL LOOP1 ;DO ONE MINUTE DELAY FOR STATIC CHECK LD HL,CKMSG ;OUTPUT "CHECKING DATA RETENTION" TO CONSOLE CALL MSG LD HL,(MEND) ;GET MEMORY BLOCK END EX DE,HL ;SWAP TO D&E REGS. LD HL,(BLKST) ;GET MEMORY BLOCK STARTING ADDRESS XOR A ;MAKE A 0'S BYTE FOR COMPARE LOOP3: CP (HL) ;WRITE IT LD BC,500*5 ;DO 5 MINUTE DELAY "DO NOTHING" CALL LOOP1 POP AF ;GET PATTERN CALL SATRD ;READ AFTER DELAY TIME XOR A ;ALL 0'S PATTERN FOR SECOND PORTION OF TEST PUSH AF ;SAVE THE PATTERN CALL BAKPT ;WRITE IT LD BC,500*5 ;DO 5 MINUTE DELAY "DO NOTHING" CALL LOOP1 POP AF ;GET PATTERN CALL SATRD ;CHECK DATA AFTER 5 MINUTE DELAY RET ; ; ; ;ROUTINE TO DO "GALLOPING" MEMORY TEST IN 256 BYTE CHUNKS ; (MEMORY DATA WILL BE FF HEX AND THEN 00 HEX) ; GAL: LD HL,PTSG ;O LD (MTOP),HL ;SAVE RESULT AS "CHUNK" END +1 LD A,0FFH ;MAKE AN ALL 1'S PATTERN BYTE CALL WALKT ;LET'S GO FOR A WALK XOR A ;MAKE AN ALL 0'S PATTERN BYTE CALL WALKT ;MAYBE WE COULD JOG FOR AWHILE? LD HL,(MEND) ;GET "CHUNK" AND BLOCK END CALL COMP ;ALL THE "CHUNKS" DONE IN THE BLOCK? JP Z,TEND ;IF ZERO,GO TO NEXT MEMORY BLOCK IN AUTO SEQUENCE EX DE,HL ;NO? GET NEW "CHUNK" START ADDRESS JP WALK1 ;GO TEST NEW "CHUNK" TEND: CALL CDROP ;SHOW ANY "DROPPED BLOCKS" LD HL,(AUTOR) ;GEOP BC ;GET PASS COUNT DEC B ;DE-BUMP THE PASS COUNT JP NZ,SAT ;CONTINUE WRITING 'TILL 100 PASSES COMPLETED RET ; ; ; ;SUBROUTINE TO INDICATE ERROR IN WRITE SATURATION TEST ; SATER: LD (ERPAT),A ;SAVE "BAD" BYTE LD A,0FFH ;SET ERROR FLAG LD (ERFLG),A PUSH HL ;SAVE BAD BYTE ADDRESS LD HL,(ECTR) ;UPDATE THE ERROR COUNTER INC HL LD (ECTR),HL LD A,(ERCNT) ;DONE DISPLAYING ALL ERRORS? DEC A JP Z,PTX ;DON'T DISPLAY ANY MORE ERRORS,IF SO LD (ERCNT),A LD HL,MRER1 ;OUTPUT " ER ;TEST "GALLOPING PATTERN" RESULT BYTE CALL NZ,RFERR ;IF IT DIDN'T SURVIVE,REPORT RETENTION ERROR INC HL ;BUMP FOR NEXT TEST BYTE CALL COMP ;HAVE WE CHECKED THE WHOLE MEMORY BLOCK? JP C,LOOP3 ;IF NOT,DO IT LD HL,CLMSG ;OUTPUT "GALLOPING COLUMN MEMORY TEST" TO CONSOLE CALL MSG LD HL,(BLKST) ;GET MEMORY BLOCK START LD (MBOT),HL ;SAVE IT FOR FUTURE USE IN "GALLOPING COLUMN" LD HL,(MEND) ;GET MEMORY BLOCK END LD (MTOP),HL ;SAVE FOR FUTURE USE IN "GALLOPING COLUMN" LD A,0FFH ;SET-U  T "AUTO1" RETURN ADDRESS JP (HL) ;GO FOR IT ; ; ; ;ROUTINE TO DO RANDOM MEMORY TEST IN "SELECT MODE" ; RNDSL: LD HL,(MTOP) ;GET OPERATOR SELECTED MEMORY "TOP" ADDRESS LD B,H ;SAVE IT IN B&C REGS. LD C,L DEC BC ;DE-BUMP B&C REGS. TO GET PROPER "TOP" ; MEMORY BOUNDRY ADDRESS LD HL,(MBOT) ;GET OPERATOR SELECTED MEMORY "BOTTOM" ADDRESS JP RANST ;GO TO RANDOM PATTERNS TEST START ; ; ; ;ROUTINE TO DO RANDOM PATTERNS MEMORY TEST IN "AUTO MODE" ; RANPT: LD HL,RDMSG ;OUTPUT "RANDOM  JP C,DONE2 DEC HL LD A,(HL) RLCA RLCA RLCA DEC HL XOR (HL) RRCA RRCA AND 1 XOR (HL) INC HL INC HL CP (HL) JP NZ,ERROR INC HL LD A,C SUB L LD A,B SBC A,H JP C,DONE2 DEC HL DEC HL LD A,(HL) INC HL INC HL CP (HL) JP NZ,ERROR JP CHKR ; ; ; ;"DONE2" CHECKS TO SEE WHICH TEST HAS JUST BEEN DONE. IF IT WAS ;THE FIRST TEST THEN IT SETS UP TO TEST THE COMPLIMENT, ELSE IT ;SETS UP FOR THE FINAL FOUR TESTS ; DONE2: LD L,E LD H,D LD SP,HL LDE OF MEMORY TOP ADDRESS, ; AND SAVE CARRY ONLY SBC A,H ;SUBTRACT HIGH BYTE OF TEST CELL ADDRESS JP C,DONE1 ;IF WE GOT THE CARRY,WERE DONE DEC SP ;NO,NOT DONE YET DEC SP POP HL LD A,L ;MAKE MORE "HASH" FOR MEMORY PATTERNS ADD A,A LD L,A LD A,H RLA LD H,A LD A,0 ADC A,L LD L,A LD A,H RLCA RLCA RLCA XOR L RRCA RRCA AND 1 XOR L LD L,A JP STORR ; ; ; ;"DONE1" CHECKS THE FIRST TWO BYTES FOR ERRORS AND ALSO CHECKS ;TO SEE WHICH PASS-THROUGH THE AGE FLAG JP (HL) AR1: IN A,(1CH) AND 8 JP Z,AR1 ;CHECK IF CONSOLE READY LD A,(BC) OUT (08),A CALL COOP INC BC ;OUTPUT CHARACTER JP MSGOUT ; ; ; ;THE "ERROR" ROUTINE PRINTS OUT THAT THERE HAS BEEN AN ERROR AT ;THE ADDRESS IN THE H&L REGISTERS.IT THEN TELLS THAT THE TEST ;BYTE IS THE BYTE IN THE ACCUMULATOR AND THE ERROR BYTE IS THE ;BYTE POINTED TO BY THE H&L REGISTERS.FINALLY IT PRINTS OUT THE ;BITS THAT ARE IN DISAGREEMENT IN THE TWO BYTES. ; ERROR: LD SP,HL LD A,0FFH ;SET EPATTERNS MEMORY TEST" TO CONSOLE CALL MSG RANMT: LD HL,(MEND) ;GET MEMORY BLOCK END ADDRESS INTO B&C REGS. LD B,H LD C,L DEC BC ;DE-BUMP B&C REGS. TO GET PROPER BLOCK END ; BOUNDRY ADDRESS DEC BC DEC BC LD HL,(BLKST) ;GET MEMORY BLOCK START ADDRESS INTO H&L REGS., ; AND D&E REGS. RANST: LD D,H LD E,L LD SP,HL ;STUFF H&L REGS. INTO SP REG. LD HL,1 ;MAKE A STARTING "SEED" FOR FIRST RANDOM PATTERN ; ; ; ;"STORR", STORES RANDOM NUMBERS THROUGHOUT THE MEMORY TEST AREA BY ;USING  HL,0FFFEH LD A,(DE) CP 2 JP Z,STORR LD L,E LD H,D LD DE,0AA55H ; ; ; ;"STOAL" STORES THE TWO BYTES IN THE D&E REGISTERS (AA HEX AND 55 HEX) ;THROUGHOUT THE TEST AREA ; STOAL: LD (HL),D INC HL LD (HL),E INC HL LD A,C SUB L LD A,B SBC A,H JP NZ,STOAL LD HL,0 ADD HL,SP ; ; ; ;"CHKAL" TEST TO SEE IF THE DATA STORED THROUGHOUT MEMORY IS THE ;SAME AS THE D&E REGISTERS ; CHKAL: LD A,D LD D,E LD E,A CP (HL) JP NZ,ERROR INC HL LD A,C SUB L LD A,B SBC APROGRAM IS ON. ; DONE1: LD L,E LD H,D LD A,1 CP (HL) JP NZ,CHECK DEC A INC HL CP (HL) JP NZ,ERROR JP CHKR ; ; ; CHECK: LD A,0FEH CP (HL) LD A,1 JP NZ,ERROR DEC A DEC A INC HL CP (HL) JP NZ,ERROR ; ; ; ;"CHKR" GOES BACK AND CHECKS TO SEE IF WHAT IS STORED ;THROUGHOUT MEMORY,IS STILL THE SAME AS WHEN IT WAS STORED. ; CHKR: LD A,(HL) RLA DEC HL LD A,(HL) RLA LD (HL),A INC HL LD A,(HL) RLA LD (HL),A INC HL LD A,C SUB L LD A,B SBC A,H RROR FLAG LD (ERFLG),A LD A,(ERCNT) ;DONE SHOWING 8 ERRORS? DEC A JP Z,ER9 LD (ERCNT),A LD HL,ER1 LD D,A LD BC,MRER1 ;OUTPUT "ERROR AT ADDRESS=" TO CONSOLE JP MSGOUT ; ER1: LD HL,0 ADD HL,SP LD B,D EX DE,HL LD HL,ER2 JP OUTER ; ER2: LD D,E LD HL,ER3 JP OUTER ; ER3: LD D,B LD BC,MER10 ;OUTPUT "PATTERN STORED=" TO CONSOLE LD HL,ER4 JP MSGOUT ; ER4: LD HL,ER5 JP OUTER ; ER5: LD BC,MER11 ;OUTPUT "PATTERN READ=" TO CONSOLE LD HL,ER6 JP MSGOUT ; ER6: LD HL,0RANDOM NUMBERS,CAUSING MOST PATTERN SENSITIVE AND ADDRESSING ;PROBLEMS TO BE CAUGHT.THE NUMBERS ARE STORED USING THE ;8080/8085 "PUSH" COMMAND WHICH STORES TWO ADJACENT BYTES IN THE ;FASTEST MANNER POSSIBLE. ; STORR: INC SP ;BUMP STACK POINTER BY 2'S INC SP PUSH HL ;STUFF THE RANDOM DATA BYTE INTO MEMORY POP HL LD HL,0 ;SCRUB H&L REGS. ADD HL,SP ;GET THE CURRENT TEST CELL ADDRESS LD A,C ;GET LOW BYTE OF MEMORY TOP ADDRESS SUB L ;SUBTRACT LOW BYTE OF TEST CELL LD A,B ;GET HIGH BYT,H JP NZ,CHKAL ; ; ; ;THIS ROUTINE FINDS OUT WHICH PASS THE TEST IS ON, ;AND THEN SETS UP TO DO THE NEXT TEST ; LD HL,0 ADD HL,SP LD DE,055AAH LD A,(HL) CP 0AAH JP Z,STOAL LD DE,0FFFFH CP 055H JP Z,STOAL LD DE,0 INC A JP Z,STOAL LD HL,(MTEST) ;GO DO NEXT MEMORY TEST,WERE DONE HERE JP (HL) ; ; ; ;THIS ROUTINE PRINTS OUT WHAT IS POINTED TO IN MEMORY BY ;THE B&C REGISTERS UNTIL A ZERO BYTE IS FOUND. ; MSGOUT: LD A,(BC) AND A JP NZ,AR1 ;CHECKS FOR '0' END OF MESS   ADD HL,SP LD E,D LD D,(HL) LD HL,ER7 JP OUTER ; ER7: LD BC,MER12 ;OUTPUT "BITS IN ERROR=" TO CONSOLE LD HL,ER8 JP MSGOUT ; ER8: LD D,0 LD B,1 LD HL,0 ADD HL,SP LD A,E XOR (HL) LD E,A ; LOP: INC D LD A,E RRA LD E,A JP NC,NOERR ; DEC B JP Z,LOPE LUPE: IN A,(1CH) AND 8 JP Z,LUPE LD A,',' OUT (08H),A CALL COOP LOPE: IN A,(1CH) AND 8 JP Z,LOPE LD A,D ADD A,2FH OUT (08H),A CALL COOP NOERR: LD A,D CP 8 JP NZ,LOP ER9: LD HL,(ECTR) ;UPDATE  SEL ;GIVE'M ANOTHER CHANCE SEL0: LD (MBOT),HL ;SAVE IT AS MEMORY "BOTTOM" ADDRESS LD HL,HMMSG ;OUTPUT "HIGH MEMORY ADDRESS=" TO CONSOLE CALL MSG CALL PARAM ;GET IT FROM OPERATOR EX DE,HL ;SWAP TO D&E REGS. LD A,D ;GET THE HIGH BYTE OF "TOP" MEMORY ADDRESS LD HL,(MBOT) ;GET MEMORY "BOTTOM" ADDRESS CP H ;IS THE TOP < BOTTOM? JP NC,STOTOP ;IF NOT,STORE THE "TOP" FOR SAFE KEEPING LD HL,NAMSG ;ARE YOU POSSIBLY ATTEMPTING TO TRY MY PATIENCE? CALL MSG JP SELCT ;TRY AGAIN,AND AGAIN,AND EX DE,HL ;SWAP'EM POP AF ;GET THE DROP COUNT DEC A ;DE-BUMP IT JP NZ,EDROP ;DO THEM ALL RET ; ; ; ;"SELECT" MODE ROUTINE (OPERATOR DEFINES ADDRESS RANGE,PATTERN,AND TEST) ; SELCT: LD A,0FFH ;SET ERROR DISPLAY COUNT TO 256 LD (ERCNT),A LD HL,SELCT ;MAKE A RETURN ADDRESS FOR END OF TEST LD (MTEST),HL MENU: LD HL,DFMSG ;OUTPUT "TEST "ALL","SELECT",OR "MONITOR" (Y OR N)?" ; TO CONSOLE CALL MSG CALL CECHO ;GET THE ANSWER CP 'A' ;"ALL" CHOSEN? JP Z,ALL CP 'S' ;"SELECT"G CALL CONI ;GET THE REQUESTED PATTERN LD C,A ;SAVE IT IN C REG. PUSH BC ;EXILE THE TEST NUMBER LD HL,TPMSG ;OUTPUT " TEST IS IN PROGRESS" TO CONSOLE CALL MSG POP BC ;FROM WHENCE THY CAME... LD DE,SELCT ;GO BACK TO "SELECT MODE" AFTER TEST COMPLETION PUSH DE DEC B ;ADJUST THE TEST NUMBER FOR THE TABLE JUMP LD A,B RLCA ADD A,B LD E,A LD D,000H ;MAKE A 16 BIT INDEX LD HL,BTAB ;GET THE TABLE BASE LD A,C ;GET BACK THE SAVED PATTERN ADD HL,DE ;GET H&L REGS. TO EQUAL TTHE ERROR COUNTER INC HL LD (ECTR),HL LD HL,(MTEST) ;RETURN JP (HL) ; ; ; OUTER: IN A,(1CH) AND 8 JP Z,OUTER LD A,D RLCA RLCA RLCA RLCA AND 0FH CP 0AH JP C,OUTR1 ADD A,7 OUTR1: ADD A,'0' OUT (08H),A CALL COOP OUTR2: IN A,(1CH) AND 8 JP Z,OUTR2 LD A,D AND 0FH CP 0AH JP C,OUTR3 ADD A,7 OUTR3: ADD A,'0' OUT (08H),A CALL COOP JP (HL) ; ; ; ; ; ; ;ROUTINE TO SHOW THE "DROP LIST" TO THE OPERATOR ; CDROP: LD A,(DROPC) ;GET THE DROP COUNT  AGAIN,AND....... STOTOP: EX DE,HL ;GET THE "TOP" BACK TO H&L REGS. INC HL ;GO ONE PAST THE END,AND SAVE IT LD (MTOP),HL SEL1: LD HL,OPMSG ;OUTPUT "TEST OPTIONS ARE:" TO CONSOLE CALL MSG LD HL,TMSG1 ;OUTPUT " 01-GALLOPING PATTERNS TEST" TO CONSOLE CALL MSG LD HL,TMSG2 ;OUTPUT " 02-GALLOPING COLUMNS TEST" TO CONSOLE CALL MSG LD HL,TMSG3 ;OUTPUT " 03-WALKING PATTERNS TEST" TO CONSOLE CALL MSG LD HL,TMSG4 ;OUTPUT " 04-RANDOM PATTERNS TEST" TO CONSOLE CALL MSG LD HL,TMSG5 ;OUTPUT " 0 CHOSEN? JP Z,SEL CP 'M' ;"MONITOR" CHOSEN? JP Z,MNTR JP MENU ;OOPS...NONE OF THE ABOVE,TRY AGAIN ALL: LD HL,01000H ;SET MEMORY "BOTTOM" LD (MBOT),HL LD HL,0C000H ;SET MEMORY "TOP" LD (MTOP),HL JP SEL1 ;TEST "ALL"..... SEL: LD HL,LMMSG ;OUTPUT "LOW MEMORY ADDRESS=" TO CONSOLE CALL MSG CALL PARAM ;GET IT FROM OPERATOR LD A,H ;IS THE REQUESTED ADDRESS <1000 HEX? CP 010H JP NC,SEL0 LD HL,NAMSG ;OOPS...NOT ALLOWED,OUTPUT "INVALID ; MEMORY ADDRESS" TO CONSOLE CALL MSG JPHE ADRESS OF THE JUMP JP (HL) ;GO FOR IT BTAB: JP GALPT ;GO DO "GALLOPING PATTERNS TEST" JP GALCL ;GO DO "GALLOPING COLUMNS TEST" JP WALKT ;GO DO "WALKING PATTERNS TEST" JP RNDSL ;GO DO "RANDOM PATTERNS TEST" JP WSATT ;GO DO "WRITE SATURATION TEST" JP STATT ;GO DO "STATIC CHECK CYCLE TEST" RET ;THIS SHOULD'NT GET USED ; ; ; ;SUBROUTINE TO INDICATE RETENTION ERROR (GALLOPING PATTERN BAD AFTER 1 MINUTE) ; RFERR: CPL ;MAKE ERROR FLAG NON-ZERO LD (ERFLG),A CPL PUSH OR A ;DID WE LOSE ANYBODY? JP NZ,PDROP LD HL,NDMSG ;OUTPUT "NO MEMORY BLOCKS DROPPED" TO CONSOLE CALL MSG RET PDROP: LD HL,DROP ;POINT TO START OF THE DROP LIST EDROP: PUSH AF ;SAVE THE DROP COUNT PUSH HL ;SAVE THE DROP POINTER LD HL,DMMSG ;OUTPUT "DROPPED MEMORY BLOCK(S)=" TO CONSOLE CALL MSG POP HL ;GET THE DROP POINTER BACK LD E,(HL) INC HL LD D,(HL) INC HL ;WERE NOW POINTING TO THE NEXT DROP LIST SLOT EX DE,HL ;GET THE ADDRESS OF THE DROPPED MEMORY BLOCK CALL HLOUT 5-WRITE SATURATION TEST" TO CONSOLE CALL MSG LD HL,TMSG6 ;OUTPUT " 06-STATIC CHECK CYCLE TEST" TO CONSOLE CALL MSG LD HL,TMSGN ;OUTPUT " ENTER TEST NUMBER(01,02,03,04,05 OR 06)=" CALL MSG CALL CONI ;GET THE ANSWER CP 000H ;HMMMM....DID HE PICK 00 HEX? JP Z,SEL1 ;IF SO,START HIM ALL OVER AGAIN CP 007H ;TEST NUMBER SELECTED >6? JP NC,SEL1 ;IF YES,GIVE THE JERK ANOTHER CHANCE LD B,A ;SAVE THE TEST NUMBER IN B REG. LD HL,EPMSG ;OUTPUT "ENTER PATTERN(00-FF)=" TO CONSOLE CALL MS  HL ;SAVE ERROR BYTE ADDRESS LD HL,(ECTR) ;UPDATE THE ERROR COUNTER INC HL LD (ECTR),HL LD A,(ERCNT) ;DONE DISPLAYING ALL ERRORS? DEC A JP Z,RFX LD (ERCNT),A LD HL,REMSG ;OUTPUT " RETENTION ERROR AT ADDRESS=" CALL MSG POP HL ;GET THE ERROR BYTE ADDRESS CALL HLOUT PUSH HL ;SAVE ERROR BYTE ADDRESS FOR EXIT CALL MSG LD HL,EXMSG ;OUTPUT "EXPECTED "00" DATA,READ BACK " TO CONSOLE CALL MSG POP HL ;RESTORE POINTER TO BAD BYTE ADDRESS, ; BUT DON'T CHANGE THE STACK PUSH HL LRER8 ;OUTPUT "TEST CELL=" TO CONSOLE CALL MSG POP HL PUSH HL EX DE,HL CALL HLOUT EX DE,HL POP HL PUSH HL LD HL,MRER9 ;OUTPUT ", OTHER CELL=" TO CONSOLE CALL MSG POP HL CALL HLOUT PUSH HL LD HL,MER10 ;OUTPUT "PATTERN STORED=" TO CONSOLE CALL MSG POP HL ;BLOW-AWAY H&L REGS. TO ADJUST THE STACK LD A,B CALL BYTEO ;SHOW IT LD HL,MER11 ;OUTPUT "PATTERN READ=" TO CONSOLE CALL MSG LD A,(TPATT) CALL BYTEO ;SHOW IT ALSO CALL CRLF ;KEEP IT NEAT LD A,0FFH ;SET THEALL MSG LD A,(TPATT) ;GET THE TEST PATTERN AND OUTPUT IT TO CONSOLE CALL BYTEO CALL CRLF ;KEEP IT NEAT LD A,0FFH ;SET THE ERROR FLAG LD (ERFLG),A CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT PTX: POP HL ;RESTORE THE "BAD" ADDRESS RET ;CONTINUE TESTING ; ; ; ;SUBROUTINE TO HANDLE ERRORS IN "GALLOPING PATTERN/COLUMN TESTS ; ERR1: PUSH HL LD HL,(ECTR) ;UPDATE THE ERROR COUNTER INC HL LD (ECTR),HL LD A,(ERCNT) ;DONE DISPLAYING ERRORS? DEC A JP Z,COMEX LD (ERCNT),A LD HL,MORT THE ERROR CPL ;BACK TO ORIGINAL STATE......... LD (TPATT),A ;SAVE IT CP B ;STILL EQUAL TO PATTERN? CALL NZ,ERR2 ;OOPS....WRONG HERE ALSO SKIP: INC HL ;BUMP THE OTHER ADDRESS EX DE,HL ;MEMORY TO D&E REGS. LD HL,(MTOP) EX DE,HL CALL COMP ;AT TOP OF MEMORY BLOCK? JP NZ,GPLOP ;IF NOT,CONTINUE "GALLOPING PATTERN" LOOP POP DE ;WHOOPIE...TOP OF MEMORY BLOCK,GET BACK TEST ADDRESS LD A,(DE) ;GET THE TEST CELL CPL ;BACK TO ORIGINAL,AND SAVE IT LD (DE),A INC DE ;BUMP FD A,(HL) ;GET THE BAD BYTE CALL BYTEO ;SHOW IT CALL CRLF RFX: POP HL ;GET THE ERROR ADDRESS BACK FOR EXIT RET ;EXIT,AND CONTINUE TESTING ; ; ; ;SUBROUTINE TO INDICATE ERROR IN WALKING PATTERN ; PTERR: PUSH HL ;SAVE BAD BYTE ADDRESS LD HL,(ECTR) ;UPDATE THE ERROR COUNTER INC HL LD (ECTR),HL LD A,(ERCNT) ;DONE DISPLAYING ERRORS? DEC A JP Z,PTX LD (ERCNT),A LD HL,MRER1 ;OUTPUT " ERROR AT ADDRESS=" TO CONSOLE CALL MSG POP HL ;GET THE BAD BYTE ADDRESS ,BUT DON'T ;CHANGE ERROR FLAG LD (ERFLG),A POP AF ;EVERYBODY BACK FROM EXILE POP BC POP DE COMEX: POP HL RET ; ; ; LOOP1: CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT LD DE,10000 LOOP2: DEC DE LD A,D OR E JP NZ,LOOP2 DEC BC LD A,B OR C JP NZ,LOOP1 RET ; ; ; ;ROUTINES FOR MEMORY TEST ; GALPT: LD B,A ;SAVE THE PATTERN CALL BAKPT ;WRITE THE "BACKGROUND" PATTERN GALST: LD HL,(MBOT) ;GET THE TEST CELL ADDRESS EX DE,HL ;SWAP FOR MEMORY TOP INTO H&L REGS. PNCEL: PUSH DE ;SAVE TESTRER6 ;OUTPUT "ERROR READING OTHER CELL" TO CONSOLE CALL MSG POP HL JP COMER ;GO TO COMMON ERROR PROCESSING ; ; ; ERR2: PUSH HL LD HL,(ECTR) ;UPDATE THE ERROR COUNTER INC HL LD (ECTR),HL LD A,(ERCNT) ;DONE DISPLAYING ERRORS? DEC A JP Z,COMEX LD (ERCNT),A LD HL,MRER7 ;OUTPUT "ERROR READING TEST CELL" TO CONSOLE CALL MSG POP HL COMER: PUSH HL ;PROTECT THE INNOCENT PUSH DE PUSH BC PUSH AF PUSH HL LD HL,(ECTR) ;UPDATE THE ERROR COUNTER INC HL LD (ECTR),HL LD HL,MOR NEXT TEST ADDRESS CALL COMP ;TOP OF BLOCK YET? JP NZ,PNCEL ;IF NOT,GET THE NEXT CELL FOR TEST RET ; ; ; GALCL: LD B,A ;SAVE THE PATTERN CALL BAKPT ;WRITE BACKGROUND LD HL,(MBOT) CNCEL: PUSH HL ;SAVE TEST CELL ADDRESS LD A,(HL) ;GET CONTENTS OF TEST CELL CPL ;FLIP IT LD (HL),A ;CRAM IT BACK CLOOP: CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT LD E,64 ;GOLLY,A DECIMAL NUMBER LD D,000H ;SCRUB D REG. ADD HL,DE EX DE,HL ;NOW D&E REGS. EQUAL H&L REGS.+64 LD HL,(MTOP THE STACK PUSH HL CALL HLOUT LD HL,MRER2 ;OUTPUT " READ BACK " TO CONSOLE CALL MSG POP HL ;GET THAT ADDRESS AGAIN PUSH HL LD A,(HL) ;GET THE ERROR BYTE CALL BYTEO ;SHOW IT LD HL,MRER3 ;OUTPUT " , EXPECTED " TO CONSOLE CALL MSG LD A,(ERPAT) ;GET THE "GOOD" DATA BYTE CALL BYTEO ;SHOW IT ALSO LD HL,MRER4 ;OUTPUT "LAST ADDRESS WRITTEN WAS" TO CONSOLE CALL MSG LD HL,(LASTW) ;GET THE LAST ADDRESS WRITTEN CALL HLOUT LD HL,MRER5 ;OUTPUT " PATTERN WAS " TO CONSOLE SATX: C CELL ADDRESS LD HL,(MBOT) ;GET ADDRESS OF OTHER CELL LD A,(DE) ;GET CONTENTS OF TEST CELL CPL ;FLIP IT OVER LD (DE),A ;STORE IT BACK GPLOP: CALL KBINT ;CHECK KEY-BOARD INTERRUPT POP DE ;GET BACK ADDRESS OF TEST CELL PUSH DE CALL COMP ;SEE IF TEST ADDRESS EQUALS OTHER ADDRESS JP Z,SKIP ;IF YES,SKIP TESTING LD A,(HL) ;GET THE OTHER CELL LD (TPATT),A ;SAVE IT JUST IN CASE IT'S WRONG CP B ;EQUAL TO PATTERN? LD A,(DE) ;READ BACK THE TEST CELL CALL NZ,ERR1 ;OOPS....REP  ) CALL COMP EX DE,HL JP M,CINCR ;BUMP THE TEST CELL ADDRESS IF < MEMORY TOP ADDRESS JP Z,CINCR POP DE ;GET AND SAVE THE TEST CELL PUSH DE LD A,(DE) CPL ;FLIP IT LD (TPATT),A ;SAVE IT IN CASE IT'S WRONG CP B ;EQUAL TO,PATTERN? CALL NZ,ERR1 ;IF NOT,REPORT ERROR LD A,(HL) ;TEST OTHER CELL LD (TPATT),A ;SAVE IT CP B ;EQUAL TO PATTERN? CALL NZ,ERR2 ;IF NOT,REPORT ERROR JP CLOOP ;TRY NEXT OTHER CELL CINCR: POP HL ;GET TEST CELL ADDRESS LD A,(HL) ;GET CONTENTS CPTOM'S IN H&L REGS. BAKGR: CALL COMP ;WE DONE? RET Z LD (HL),A ;STORE THE BACKGROUND PATTERN INC HL ;BUMP FOR NEXT ADDRESS JP BAKGR ;GO DO MORE 'TILL WE HIT TOP ; ; ; ;SUBROUTINE TO INCREMENT H&L REGS. MODULO 64 ; INC64: INC HL ;TEST FOR WRAP-AROUND LD A,L AND 63 RET NZ LD A,L SUB 64 LD L,A RET NC DEC H ;BORROW IF NEEDED RET ; ; ; ;SUBROUTINE TO COMPARE H&L REGS. TO D&E REGS. FOR BLOCK COMPLETION ; COMP: PUSH BC LD B,A LD A,H SUB D JP NZ,COMP1 LD A,L ,REPORT ERROR INC HL ;BUMP THE POINTER JP CPAT1 ;GO FOR MORE WKSET: EX DE,HL ;SET-UP FOR NEXT SECTION,H&L REGS. EQUAL ; LAST ADDRESS IN BLOCK+1 POP DE ;D&E REGS. EQUAL "LAST WRITTEN" ADDRESS EX (SP),HL ;H&L REGS. EQUAL FIRST ADDRESS IN BLOCK PUSH DE ;JAM-ON "LAST WRITTEN" TO STACK CPL ;GET TEST PATTERN BACK CPAT2: CP (HL) ;TEST PATTERN BYTES FROM START OF BLOCK, ; TO "LAST WRITTEN" CALL NZ,PTERR ;ERROR IN "WALKED" BYTE? CALL COMP ;NO,THEN ARE WE DONE? INC HL JP NZ,CPAT2 RAGE FOR "ERROR" COUNTER ERCNT: DEFS 1 ;STORAGE FOR ERROR DISPLAY COUNTER ; ; ; END L ;FLIP BACK TO ORIGINAL LD (HL),A ;RESAVE CALL INC64 ;BUMP TEST ADDRESS MODULO 64 LD A,(HL) ;EQUAL TO PATTERN? LD (TPATT),A ;SAVE IT IN CASE IT'S WRONG CP B CALL NZ,ERR1 CALL INC64 LD A,(HL) LD (TPATT),A CP B CALL NZ,ERR1 CALL INC64 AND 63 RET Z ;RETURN IF WRAPPED AROUND TO START ADDRESS JP CNCEL ; ; ; WALKT: CALL BAKPT ;WRITE FULL BACKGROUND PATTERN LD HL,(MBOT) ;POINT TO FIRST BYTE OF BLOCK ADDRESS PUSH HL ;SAVE FOR INSTANT RESET CPL ;FLIP BACKGROUND PA SUB E COMP1: LD A,B POP BC RET ; ; ; ;STORAGE FOR VARIABLES AND STACK POINTERS ; DEFS 16 ;16 BYTE STACK POINTER STORAGE AREA STACK: DEFS 000H ERPAT: DEFS 1 ;STORAGE FOR ERROR PATTERN ERFLG: DEFS 1 ;STORAGE FOR BLOCK ERROR FLAG DROPC: DEFS 1 ;STORAGE FOR NUMBER OF "DROPPED" BLOCKS DROP: DEFS 28 ;DROP BUFFER DROPP: DEFS 2 ;POINTER TO NEXT FREE SLOT IN DROP LIST MBUF: DEFS 15 ;MEMORY BLOCK BUFFER DEFB 080H ;TERMINATOR FOR MEMORY BLOCK BUFFER POINTER MEMPT: DEFS 2 ;STORAGE FOR ;GO FOR MORE IF NOT DONE YET POP HL ;SET-UP FOR NEXT PATTERN BYTE,H&L REGS. EQUAL ; "LAST WRITTEN" ADDRESS POP DE ;D&E REGS. EQUAL LAST ADDRESS IN BLOCK+1 INC HL ;BUMP FOR NEXT ADDRESS TO WRITE CALL COMP ;DONE THE WHOLE THING? RET Z PUSH HL ;NO,PUT A COPY OF MEMORY BOTTOM ON THE STACK LD HL,(MBOT) EX (SP),HL JP WPAT ;GO DO SOME MORE ; ; ; ;SUBROUTINE TO GENERATE BACKGROUND PATTERN AS CONTAINED IN A REG. ; BAKPT: LD HL,(MTOP) EX DE,HL LD HL,(MBOT) ;TOP'S IN D&E REGS.,BOTTTERN FOR TEST PATTERN LD (TPATT),A ;SAVE IT WPAT: CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT LD A,(TPATT) ;GET THE TEST PATTERN LD (HL),A ;STUFF PATTERN INTO MEMORY PUSH HL ;SAVE "LAST WRITTEN" ADDRESS LD (LASTW),HL INC HL CPL ;FLIP TO BACKGROUND PATTERN CPAT1: CALL COMP ;TEST BACKGROUND PATTERN FROM "LAST WRITTEN+1", ; TO "END OF BLOCK" ;TESTED ALL REMAINING BACKGROUND? JP Z,WKSET ;IF YES,GO TEST PATTERN BYTES CP (HL) ;NO...TEST BACKGROUND BYTE CALL NZ,PTERR ;IF BAD BYTEMEMORY BUFFER POINTER BLKST: DEFS 2 ;STORAGE FOR MEMORY BLOCK START ADDRESS MEND: DEFS 2 ;STORAGE FOR MEMORY BLOCK END ADDRESS MBOT: DEFS 2 ;STORAGE FOR 256 "CHUNK" START ADDRESS MTOP: DEFS 2 ;STORAGE FOR 256 "CHUNK" END ADDRESS TPATT: DEFS 1 ;STORAGE FOR LAST PATTERN WRITTEN LASTW: DEFS 2 ;STORAGE FOR LAST ADDRESS WRITTEN MTEST: DEFS 2 ;STORAGE FOR MEMORY TEST POINTER AUTOR: DEFS 2 ;STORAGE FOR "AUTO1" RETURN ADDRESS FOR LOOPING PCTR: DEFS 2 ;STORAGE FOR "PASS" COUNTER ECTR: DEFS 2 ;STO  Z-80 Floppy Disk Test Original Version: Copyright (c) 1980 by Laboratory Microsystems 4147 Beethoven Street Los Angeles, California 90066 1.0 General description The Z-80 Floppy Disk Test is a general purpose utility for testing or initializing a diskette. It requires a Z-80 microprocessor, at least 16 kbytes of random access memory, two flexible disk drives, and the Digital Research CP/M 2.x operating syversion 2.0 or greater, the program will immediately print a warning message and exit. Otherwise, the test proceeds to the initialization dialogue. The test mode is set via a series of questions presented on the system console. Answers calling for an alphabetic character may be upper or lower case; a carriage return is not required. Answers calling for a number must be two digits, or one digit followed by a carriage return. query responses explanation -- damaged flexible disk. Error free execution of the test certainly indicates an intact and usable diskette, and also is fairly good evidence of proper operation of your disk drive. Note that the program is rather insensitive to drive problems related to head movement, since the diskette is addressed in a smooth sequential manner. 2.0 Installation Mount your system disk in drive A, and the distribution disk in drive B. Use the PIP utility to transfer the test program onto the syst the media). W = lock on write (all data on the disk is destroyed --- this may be used to erase a diskette by also locking on pattern) Restore original data? Y or N Y = restore existing data on diskette after testing each stem. Program mode and area of diskette to be tested are controlled from the keyboard. Errors may be audited on the console or the line printer. The proram is available on this diskette in 4 versions. 2DISKTST.COM Is assembled for the Kaypro 2 (191 K / disk) 4DISKTST.COM Is assembled for the Kaypro 4 (390 K / disk) 8DISKTST.COM Is assembled for Kaypro's with 96 TPI dbl. sided disk drives ( Like the Pro 8 System from Micro Cornucopia ). 10DSKTST.COM Is assembled for the Kaypro 10 --- --------- ----------- Itemize errors? Y or N If answered y, each error detected is audited on the selected device. If answered N, only the total error count is printed at the end of each pass. Console or Printer? C or P If itemizem disk: A>pip a:=b:dtst.com [v] Now remove the distribution disk from drive B and store it as the backup copy. 3.0 Using the Test Program Put your system disk in drive A, boot up the CP/M operating system, and type: A>dtst The test program will load into memory and print the identifying message: Laboratory Microsystems Disk Test version 1.0 If there is inadequate memory in the transient program area, or if the operating system is not CP/M  sector. N = do not restore existing data. Test runs much faster when restore mode is not used. Lock on data pattern? Y or N Y = user wishes to specify specific data to be used as the test pattern. N = random data patteand will only test the floppy drive on that system. DO NOT use the disk diagnostic on the HARD DISK !!!!!!!!!!!!!!!! The program does not exhaustively check out the disk drive, and any errors detected by the program must be interpreted with care. Intermittent errors occurring throughout a broad range of disk addresses probably indicate a problem with the disk drive unit. Errors indicated at consistent addresses within adjacent tracks may result from a worn oring errors, select the device on which the itemized error listing will be printed. Lock on read or write? N, R, or W N = no locks. R = lock on read mode (no data is written to the disk --- useful for detecting any damaged areas on   rn is generated by the test program. Enter data pattern hex 00-FF If you answered Y to Lock On Pattern, enter the eight bit data pattern to be used during disk testing. If you answered N, this question is bypassed. Drive to be tested Specify disk drive to be us number of the last sector to test on each track. Must be the same or greater than the number of the first sector to test. How many test passes? decimal 01-99 Enter the number of test passes to be made on the test. Must be the same or greater than the number of the first track to test. Test all sectors? Y or N Y = test all sectors (0-39) in sequence. N = user wishes to specify range of sectors (may be used to test only part of each track, or ior type explanation ---------- ----------- read error - original data If running in restore mode, hardware read error noted as the original data was being loaded into memory. write error - test data Hardware error noted as the test data pattern was being written on the diskette. read error - test data ed for diskette testing. Test all tracks? Y or N Y = test all tracks (00-76) in sequence. N = user wishes to specify range of tracks (may be used to test only part of a diskette, or if disk drive is other than Kaypro Format. First tra diskette. At least one pass is always made even if you enter zero. After entry of the number of test passes, the program immediately begins executing. The program may be interrupted by pushing any key, however response may be delayed for several seconds depending on the speed of the processor and disk drive. Do not stop the test by resetting the computer system if you are using restf disk drive is other than Kaypro format. First sector to test decimal 0-39 If you answered N to Test All Sectors, specify here the number of the first sector to test on each track. Last sector to test decimal 0-39 If you answered N to Test All Sectors, specify here the  Hardware error noted as the test data pattern was being read back from the diskette. compare error - test data Difference was found between the data pattern that was written to the diskette and the data that was read back. write error - restore phase Hardware error noted as the original ck to test decimal 00-999 If you answered N to Test All Tracks, specify here the number of the first track to test. Last track to test decimal 00-999 If you answered N to Test All Tracks, specify here the number of the last track to ore mode, or unpredictable amounts of data may be lost. 4.0 Error Listing Errors detected by the program may be itemized on the system console or the line printer. The pass, drive name, track, and sector where the error occurred are listed. All numbers are in decimal. The error type is designated at the right. In the explanations below, "hardware error" signifies an error status code returned from the low level disk driver, and usually means a CRC fault or seek incomplete. err   data was being written back to the diskette. read error - restore phase Hardware error noted as the restored original data was being read back for verification. data cannot be restored Compare error found between the original data rewritten to the diskette and the same sectors read s? $ First track to test $ Last track to test $ Test all sectors? $ First sector to test $ Last sector to test $ How many test passes? $ Pass Drive Track Sector Error-type $ Pass nnnn complete, nnnn errors. $ Not enough memory to execute. $ Beginning disk test - push any key to abort program. $Warning: user data will not be restored. $User data will be restored. $ Continue or exit test? (C/E)$ Goodbye. $ Use sector skew? $ Need CP/M 2.x to execute. $r ͵! ͇!`l [S*RҡKC!ͻ K!ͻ  :(!22*[Rڛ c$e  S" !"*" MW([j0S" !"*" M\([j0* " *"[ S *R: _w#z :w#z Cf"hK # x [hR * " [fj# x}(: ZSK!ͻ :A2K!ͻ K :(a!ͻ : (*|   [ *#"*| !!*~$_# *************************************************************** OPERATORS MANUAL FOR THE MICROCOSM ASSOCIATES MEMORY DIAGNOSTIC, VERSION 1.0 *************************************************************** COPYRIGHT 1979,1980 BY MICROCOSM ASSOCIATES DONATED TO THE "SIG/M" CP/M USER'S GROUP, BY KELLY SMITH CP/M IS A REGISTERED TRADEMARK OF DIGITAL RESEARCH --------------------------------------------------------------- BAY AREA KAYPRO USE back for verification. ead error - original data$write error - test pattern$read error - test pattern$compare error - test pattern$original data cannot be restored$write error - restore phase$read error - restore phase$   ͥ yn͗ (Y/N) > $   ͥ > $ F  !:!Gͥ (08:0)))_͗  > $?$   !:!Gͥ (08:8 g0a8 ))))o}͗  > $   ?$( _ d  y0w#!R!>0=nnnn n nnnn nnnn $:O*KK :(aK !)2D$'!h N Z80 Disk Diagnostic Test version 1.1 Modified for the Kaypro 10 By Micro Cornucopia Magazine Original Version (c) 1980 Laboratory Microsystems $ Itemize errors? $ Use console or printer? (C/P) $ Lock on read or write? (N/R/W) $ Restore original data? $ Lock on data pattern? $ Enter data pattern, hex 00-FF$ Drive to be tested (C-C) $ Confirm: test drive X ? $ Test all trackRS & PROGRAMMERS KAYPRO II IMPLEMENTATION NOTES To run this diagnostic on the Kaypro, you need have a printer or console you can connect to either the parallel or serial ports to capture the program output. This is necessitated by the way the KP handles the CRT (memory mapped output using the PROM). Since it would have been difficult to include all the code necessary to put program output on the screen (normal BIOS functions are unavailable when that section of memory may be among those tes$ir *R0   } (  2222222222  y(>2# c( pė >2D n(r >25wė >2f y >2 n(>2L 2 aܗ 8ԗ 02A2 n(!"!O" y( "# "[Rܗ 8!"!'"> y(V "q "[Rܗ 8 " V:( *"m:( !`͇:(!! ͵:(!85 ͇: !8O :(!` }͗  > $   ?$( _ d  y0w#!R!>0=  ted), I took the easy way out and assumed another device was available. If the port you are using is the serial, you should use MDIAGTTY.COM, and if it's the parallel, use MDIAGLPT.COM. In any case, the program wants its input from the KP keyboard. In the automatic mode, the program runs extensive tests on the middle 3/4 of memory (1000H to C000H, which is just about all the TPA). This takes quite a while to run. If you wish to check beyond C000H or to run a faster test, use the non-auto000 TOTAL ERRORS=0000 RANDOM PATTERNS TEST THE TEST WILL PROCEED TO TEST WITH "WRITE SATURATION TEST", "GALLOPING PATTERNS TEST","STATIC CHECK CYCLE","CHECKING DATA RETENTION","GALLOPING COLUMNS TEST", AND "WALKING PATTERNS TEST". THE TEST WILL THEN PROCEED TO THE NEXT 4K BYTE MEMORY BLOCK. A "N" RESPONSE TO "TEST MEMORY IN AUTO MODE (Y OR N)?" WILL CAUSE THE FOLLOWING DISPLAY TO APPEAR ON THE REMOTE CONSOLE: TEST "ALL","SELECT",OR "MONITOR" (A,S OR M)? ENTRE "-" PROMPT CHARACTER IS DISPLAYED, THE FOLLOWING KEYBOARD ENTRIES MAY BE MADE FOR TEST/DIAGNOSTIC SELECTIONS. A. "G" CAUSES "GO ADDRESS=", ALLOWING EXECUTION OF CODE AT ANY ADDRESS IN ROM/RAM MEMORY. B. "M" CAUSES "MEMORY ADDRESS ", TO ALLOW DISPLAYING ANY ADDRESS IN ROM/RAM MEMORY. FOR EXAMPLE: -MEMORY ADDRESS=NNNN (CR) NNNN=NN (SP) NNN1=NN AA (WHERE "AA" IS AN OPERATOR ENTRY) NNN2=NN ^ (WHERE "^" IS AN OPERATOR ENTRY TO EXAMINE  THE COMMAND MONITOR (SEE SECTION 1.1 FOR DETAILED EXPLANATION OF OPERATION),AND WILL PROMPT WITH A "-" CHARACTER TO INDICATE MONITOR MODE. 3.0 RAM MEMORY TEST ERROR MESSAGES A. RANDOM PATTERNS MEMORY TEST MEMORY ERRORS OCCURING DURING THE RANDOM PATTERNS TEST WILL BE DISPLAYED ON THE REMOTE CONSOLE AS FOLLOWS: ERROR AT ADDRESS=NNNNN PATTERN STORED=NN PATTERN READ=NN BIT(S) IN ERROR=N,N,N,N,N,N,N,N NOTE, THAT ON TRANSIENT/DYNAMIC TYPE ERRORS,  mode. In doing so, note that the top two bytes of RAM (FFFEH and FFFFH) seem unaccessible for some of the tests--the program loops if asked to test them. Steve McMahon Berkeley March, 1983 --------------------------------------------------------------- 1.0 DIAGNOSTIC TEST "START-UP" EXECUTION 1.1 THE TEST WILL INITIALLY "SIGN ON",WITH THE FOLLOWING MESSAGE DISPLAYED ON THE REMOTE CONSOLE: MICROCOSM ASSOCIATES MEMORY DIAGNOSTIC VER.1.0 (C) 1979 TOP OF MEMORY=NNNN Y OF "S" ON THE KEYBOARD ALLOWS "SELECTION" OF TESTING MEMORY FROM ADDRESS 1000 HEX TO FFFF HEX,WITH THE FOLLOWING DISPLAY APPEARING ON THE REMOTE CONSOLE: (NOTE: A MINIMUM ADDRESS DIFFERENTIAL OF THREE ADDRESS'S MUST BE UTILIZED BY THE OPERATOR, AND MEMORY MAY NOT BE TESTED BELOW RAM MEMORY ADDRESS 1000 HEX. LOW MEMORY ADDRESS=NNNN (CR) HIGH MEMORY ADDRESS=NNNN (CR) TEST OPTIONS ARE: 01-GALLOPING PATTERNS TEST 02-GALLOPING COLUMNS TEST 03-WALKING PATTERNS TEST 0 "PREVIOUS") NNN1=AA (SP) NNN2=BB E (WHERE "E" INDICATES "MEMORY ERROR" ON ENTRY) NNN3=NN (CR) - (WHERE "-" IS A RETURN TO THE MONITOR BY CARRIAGE-RETURN) C. "T" CAUSES "TEST MEMORY IN AUTO MODE (Y OR N)?" TO BE DISPLAYED ON THE REMOTE CONSOLE.ENTERING "Y" ON THE REMOTE CONSOLE KEYBOARD WILL CAUSE THE FOLLOWING DISPLAY TO APPEAR: NO MEMORY BLOCKS DROPPED TESTING MEMORY FROM 1000 TO 2000 PASS=0THE PATTERN STORED MAY MATCH THE PATTERN READ AND NO BITS WILL BE IN ERROR. THE ERROR DETECTION LOGIC OF THE TEST SOFTWARE IS SUCH THAT ANY IMMEDIATE MISMATCH IS DETECTED BUT THE ERROR CELL STATE IS NOT SAVED. SUBSEQUENT SOFTWARE PROGRAM DELAYS LATER, THE ERROR CELL ADDRESS CONTENT IS AGAIN EXAMINED FOR THE MISMATCH TO BE DISPLAYED, BUT THE CELL IS NOW CORRECT. THIS INDICATES THAT A TRANSIENT/DYNAMIC ERROR HAS OCCURRED. THE TEST SEQUENCE IS AS FOLLOWS: 1. RANDO MEMORY QUALIFICATION TEST IS IN PROGRESS ANY ERRORS OCCURING DURING THE "MEMORY QUALIFICATION TEST" WILL BE DISPLAYED AS FOLLOWS: ERROR AT ADDRESS=NNNN PATTERN STORED=NN PATTERN READ=NN BIT(S) IN ERROR=N,N,N,N,N,N,N,N THE DIAGNOSTIC PROGRAM WILL NOW PROCEED TO DISPLAY THE FOLLOWING MESSAGE ON THE REMOTE SYSTEM CONSOLE: MEMORY TEST IN AUTO MODE (Y OR N)? (REFERENCE SECTION 2.1 C FOR ADDITIONAL INFORMATION) 2.0 DIAGNOSTIC COMMAND MONITOR 2.1 WHEN TH4-RANDOM PATTERNS TEST 05-WRITE STAURATION TEST 06-STATIC CHECK CYCLE TEST ENTER TEST NUMBER(01,02,03,04,05 OR 06)=NN ENTER PATTERN (00-FF)=NN TEST IS IN PROGRESS PROGRAM TEST EXECUTION BEGINS AT THE TWO DIGIT ENTRY FOR "ENTER PATTERN (00-FF)=" BY DISPLAYING "TEST IS IN PROGRESS". ENTERING "A" FOR "ALL",AUTOMATICALLY BEGINS EXECUTION BY DISPLAYING "TEST OPTIONS ARE:",ASSUMING THAT THE TEST ADDRESS RANGE IS FROM 8000 HEX TO BFFF HEX. ENTERING "M" FOR "MONITOR",CAUSES EXITING TO  M DATA PATTERNS ARE WRITTEN THRUOUT THE 4K BYTE CELL MEMORY BLOCK. 2. ALL 4K BYTE CELLS ARE READ. 3. ALL 4K BYTE CELLS ARE COMPLEMENTED. 4. ALL 4K BYTE CELLS ARE READ. 5. ALL 4K BYTE CELLS ARE ALTERNATELY WRITTEN WITH 55 HEX AND AA HEX. 6. ALL 4K BYTE CELLS ARE READ. 7. ALL 4K BYTE CELLS ARE COMPLEMENTED. 8. ALL 4K BYTE CELLS ARE READ. 9. ALL 4K BYTE CELLS ARE WRITTEN WITH ALL 1'S. 10. ALL 4K BYTE CELLS ARE READ. 11. ALL 4K BYTE CELLS AR READ AND EVERY OTHER CELL. 3. THE TEST CELL IS WRITTEN TO IT'S ORIGINAL STATE. 4. THE NEXT SEQUENTIAL CELL IS TESTED AS IN STEP 2 AND 3. 5. A "BACKGROUND" PATTERN OF ALL 0'S IS WRITTEN INTO THE SAME 256 BYTE PORTION OF THE 4K BYTE BLOCK OF MEMORY. 6. STEPS 2,3, AND 4 ARE REPEATED. 7. STEPS 1 THRU 6 ARE REPEATED FOR THE NEXT SEQUENTIAL 256 BYTES IN THE 4K BYTE BLOCK. D. STATIC CHECK CYCLE. UTILIZED IN THE MEMORY TEST AUTOMATIC MODE ONLY, A STATIC CHECK CYCLDISPLAYED ON THE REMOTE CONSOLE AS FOLLOWS: ERROR READING OTHER CELL TEST CELL=NNNN, OTHER CELL=NNNN PATTERN STORED=NN PATTERN READ=NN THE "OTHER" CELL (WRITTEN FROM A BACKGROUND PATTERN OF 0'S OR 1'S) HAS BEEN DISTRUBED BY WRITING INTO THE "TEST" CELL. ALTERNATELY,THIS MESSAGE MAY APPEAR: ERROR READING TEST CELL TEST CELL=NNNN, OTHER CELL=NNNN, PATTERN STORED=NN PATTERN READ =NN THE TEST CELL HAS BEEN DISTURBED BY WRITING INTO SOME "OTHER" CELL. THE FAILURE TYELY READING THE TEST CELL AND LOCATIONS +64 ADDRESS'S FROM THE TEST CELL (E.G. TEST CELL +64 (N), WHERE N=1,2,3,.... ,63). 4. READ THE TEST CELL, THEN WRITE THE TEST CELL'S COMPLEMENT INTO THE TEST CELL, SO THAT IT IS IN IT'S ORIGINAL "BACKGROUND" STATE. 5. READ TWO CELLS FOLLOWING THE TEST CELL FOR REFRESH CHECK. 6. REPEAT STEP 5 FOR ALL CELLS OF THE CURRENT TEST COLUMN, AND EVERY OTHER COLUMN (E.G. READ CELLS 3,6,9,....63; 2,4,9,..E COMPLEMENTED. 12. ALL 4K BYTE CELLS ARE READ. B. WRITE SATURATION TEST MEMORY ERRORS OCCURING DURING THE WRITE SATURATION TEST WILL BE DISPLAYED ON THE REMOTE CONSOLE AS FOLLOWS: ERROR AT ADDRESS=NNNN READ BACK NN ,EXPECTED NN THE FAILURE TYPE REVEALED IS SLOW SENSE AMPLIFIER RECOVERY DUE TO SUSTAINED "CHARGING" OF 0'S OR 1'S ON THE SENSE AMPLIFIER CIRCUITRY. THE TEST SEQUENCE IS AS FOLLOWS: 1. WRITE A "BACKGROUND" PATTERN OF ALL 0'S IN A 4K BYTE BLOCK E WILL OCCUR AS FOLLOWS: ANY FURTHER MEMORY READ OR WRITE OPERATION IS TERMINATED FOR ONE MINUTE. AFTER THIS DELAY TIME, THE LAST STATE OF MEMORY TESTING PATTERNS FROM THE GALLOPING PATTERNS MEMORY TEST IS READ FOR THE 4K BYTE BLOCK TO TEST FOR POSSIBLE ERRORS DUE TO RETENTION LOSSES. THE FOLLOWING MESSAGE WILL APPEAR ON THE REMOTE CONSOLE: CHECKING DATA RETENTION ANY DATA RETENTION ERROR DETECTED WILL BE DISPLAYED ON THE REMOTE CONSOLE AS FOLLOWS: PE REVEALED IN EITHER ERROR MESSAGE INDICATES EITHER UNSATISFACTORY ADDRESS TRANSITIONS BETWEEN EACH CELL AND EVERY OTHER CELL, SLOW SENSE AMPLIFIER RECOVER, OR DESTRUCTION OF DATA DUE TO NOISE COUPLING BETWEEN CELLS WITHIN A COLUMN. THE TEST SEQUENCE IS AS FOLLOWS: 1. A "BACKGROUND" PATTERN OF ALL 1'S IS WRITTEN INTO A 256 BYTE PORTION OF A 4K BYTE BLOCK OF MEMORY. 2. THE COMPLIMENT OF THE TEST CELL IS WRITTEN INTO THE TEST CELL, AND ALTERNATELY THE TEST CELL IS.62; 1,4,7,.....61; ETC., ETC.) 7. REPEAT STEPS 2 THRU 6 FOR ALL COLUMNS. 8. WRITE A "BACKGROUND" PATTERN OF ALL 0'S FOR 64 BYTES IN THE 4K BYTE MEMORY BLOCK. 9. REPEAT STEPS 2 THRU 7. 10. REPEAT STEPS 1 THRU 9 FOR THE NEXT SEQUENTIAL 64 BYTES IN THE 4K BYTE MEMORY BLOCK. ALL FAILURE TYPE REVEALED INDICATES EITHER UNSATISFACTORY ADDRESS TRANSITIONS BETWEEN EVERY CELL AND THE POSITION OF THE CELL'S ROW, DESTRUCTION OF STORED DATA DUE TO NOISE COUPLING AMOUNG REPEATEDLY FOR 100 WRITE PASSES 2. WRITE ALL 1'S IN A 4K BYTE BLOCK FOR 1 WRITE PASS ONLY. 3. SEQUENTIALLY READ ALL BYTES IN THE 4K BYTE BLOCK. 4. WRITE A "BACKGROUND" PATTERN OF ALL 1'S IN A 4K BYTE BLOCK REPEATEDLY FOR 100 WRITE PASSES. 5. WRITE ALL 0'S IN A 4K BYTE BLOCK FOR 1 WRITE PASS ONLY. 6. SEQUENTIALLY READ ALL 4K BYTES IN THE 4K BYTE BLOCK. C. GALLOPING PATTERNS MEMORY TEST MEMORY ERRORS OCCURING DURING THE GALLOPING PATTERNS MEMORY WILL BE  DATA RETENTION ERROR AT ADDRESS=NNNN EXPECTED "00" DATA, READ BACK NN E. GALLOPING COLUMNS MEMORY TEST ERROR MESSAGES ARE IDENTICAL TO THOSE DISPLAYED FOR THE GALLOPING PATTERNS MEMORY TEST. THE TEST SEQUENCE IS AS FOLLOWS: 1. A "BACKGROUND" PATTERN OF ALL 1'S IS WRITTEN INTO A 64 BYTE BYTE PORTION OF A 4K BYTE BLOCK OF MEMORY. 2. THE COMPLEMENT OF THE TEST CELL IS WRITTEN INTO THE TEST CELL, FOR THE CURRENT TEST COLUMN. 3. TEST CELL ROW'S ARE READ BY ALTERNAT   CELLS IN THE SAME COLUMN, OR REFRESH ERRORS. F. WALKING PATTERNS MEMORY TEST MEMORY ERRORS OCCURRING DURING THE WALKING PATTERNS MEMORY TEST WILL BE DISPLAYED ON THE REMOTE CONSOLE AS FOLLOWS: ERROR AT ADDRESS=NNNN READ BACK NN, EXPECTED NN LAST ADDRESS WRITTEN WAS NNNN, PATTERN WAS NN THE TEST SEQUENCE IS AS FOLLOWS: 1. WRITE A "BACKGROUND" PATTERN OF ALL 1'S FOR 256 BYTES IN A 4K BYTE MEMORY BLOCK. 2. WRITE THE COMPLEMENT OF THE TEST CELL INTO THE TEST CELL. 3. >2T;U;͞O~/wGNx/wy#)(͞**=p#)K**~#)\=p#)~x/w#)l=~#)x/G~x/G#)ҁ ʺ ooz>0:OHT=xGw#)=xG~#)=xGw#)=xG~#)"Hx2=/w#W* zT{:G/w#)mW)DMF͝ ooͫ_͝ʿͫ 7O0  Dog"o*o_{_01  ESS MAY NOT BE GREATER THAN THE HIGH MEMORY ADDRESS, ANY ADDRESS RANGE FROM 1000 HEX TO FFFF HEX MAY BE TESTED .HOWEVER, A MINIMUM DIFFERENCE IN ADDRESS OF 3 IS REQUIRED DUE TO THE "PUSH/POP" METHOD OF MEMORY TEST BY THE RANDOM PATTERNS MEMORY TEST ("PUSH AND POP" INSTRUCTIONS ARE UTILIZED FOR MEMORY ACCESS'S BECAUSE THESE TWO INSTRUCTIONS PERFORM THE FASTEST ACCESS OF MEMORY).  MEMORY BLOCK. THE FAILURE TYPES REVEALED ARE INTERNAL MULTIPLE ADDRESS SELE .Z80 ASEG ;*********************************************************************** ; MICROCOSM ASSOCIATES "SUPER MEMORY DIAGNOSTIC" VERSION 1.01 (C) 1979 ;*********************************************************************** ; ;DONATED TO THE "SIG/M" CP/M USER'S GROUP BY: ;KELLY SMITH, MICROCOSM ASSOCIATES ;3055 WACO AVENUE ;SIMI VALLEY, CALIFORNIA, 93065 ;(805) 527-9321 (MODEM, CP/M-NET (TM)) ;(805) 527-0518 (VERBAL) ; ; ; ORG 0100H ; ; ; DI ;DISABLE INTERRUPTS LD SP,STACK ;SE READ THE REMAINING 256 BYTES, IN THE 4K BYTES OF THE BLOCK. 4. READ THE TEST CELL. 5. WRITE THE COMPLEMENT OF THE TEST CELL BACK TO IT'S ORIGINAL "BACKGROUND" STATE. 6. REPEAT STEPS 2 THRU 5. 7. WRITE A "BACKGROUND" PATTERN OF ALL 0'S FOR 256 BYTES IN THE 4K BYTE MEMORY BLOCK. 8. REPEAT STEPS 2 THRU 6. 9. REPEAT STEPS 1 THRU 8 FOR THE NEXT SEQUENTIAL 256 BYTES IN THE 4K BYTE MEMORY BLOCK. THE FAILURE TYPES REVEALED ARE INTERNAL MULTIPLE ADDRESS SELE   : $Y#|7{z*"=_p#);*"=_~#)O*}Gog"1!$ʆF~/wNpx% MEMRS Memory Test - Version 1.9BIOSBDOS located at Top of memory at Press "SP" or "^C" to warm boot at any time or "^X" to restart test from beginning. Response of "CR" gives default test range which starts above this program and ends at LOCATION SHOULD BE WAS "CR" to continue test - "SP", "^C" to quit, "^X" to restart. Test series complete  1ͷ>2:E*.Z*.u",:…ÈҢ!!)"ҿe!Ô":***#)ÿ""͞͞:¨i!'(*!0(HTHTHT>G[UiixGzxG1U33F12  >9°:P;xW;:=2 T THE STACK POINTER JP INIT ;INITIALIZE ; ; ; ; ; ; ;DEFINE CONSOLE I/O PARAMETERS FOR ALTAIR 2SI/O BOARD ; CCTRL EQU 06H ;CONSOLE COMMAND/STATUS PORT CDATA EQU 04H ;CONSOLE DATA PORT CRRDY EQU 01H ;RECEIVER READY BIT CTRDY EQU 04H ;TRANSMITTER READY BIT ; ; ; ;SUBROUTINE TO CONVERT TWO HEX CHARACTERS TO ONE BYTE ; NBL: SUB '0' RET C ADD A,0E9H RET C ADD A,6 JP P,NIO ADD A,7 RET C NIO: ADD A,10 OR A RET ; ;SUBROUTINE TO CONVERT A BYTE TO TWO HEX CHARACTERS CTION,DESTRUCTION OF STORED DATA DUE TO NOISE COUPLING WITHIN A COLUMN,AND SLOW SENSE AMPLIFIER RECOVERY. G. OPERATOR ERROR MESSAGES ANY NON-HEXIDECIMAL KEYBOARD ENTRIES ON THE REMOTE CONSOLE WILL BE PROMPTED WITH A "?" CHARACTER, AND A RETURN TO THE COMMAND MONITOR. ANY ATTEMPT TO TEST "OUT OF RANGE" OF ADDRESS SELECTIONS WILL PROMPT WITH: INVALID MEMORY ADDRESS TESTING OF MEMORY IS NOT ALLOWED BELOW ADDRESS 1000, OR ABOVE FFFF, ALSO THE LOW MEMORY ADDR Starting address (Hex or "CR") Ending address (Hex or "CR") Input error - Retype 4 hex digits Non-destructive test of ALL MEMORY starting at 0 Bit stuck high or low test Adjacent bits shorted test Checkerboard (55AAH pattern) test Walking bit left test Walking bit right test Address line test Random number test - Cycle: Re-enter, starting address must be at least Re-enter, ending address too low:2 22!~-#~BR22>2>2   ; LBYTE: PUSH AF RRCA RRCA RRCA RRCA AND 0FH CALL HXDA POP AF AND 0FH JP HXDA HXDA: CP 10 JP M,CNO ADD A,7 CNO: ADD A,30H LD C,A JP CO ; ; ; ;CONSOLE INPUT ROUTINE ; CI: IN A,(07H) AND CRRDY JP Z,CI IN A,(05H) AND 7FH RET ; ; ; CRLF: LD C,0DH CALL CO LD C,0AH JP CO ; ; ; CONO: CALL BYTEO CALL CRLF RET ; ; ; CONI: PUSH BC CALL BYTEC POP BC RET ; ; ; ;CONSOLE OUTPUT ROUTINE ; CO: IN A,(CCTRL) AND CTRDY JP Z,CO HLCO LD C,'=' CALL CO LD A,(HL) CALL BYTEO LD C,20H CALL CO RET ; ; ; MEM: LD HL,MSG1 ;OUTPUT "MEMORY ADDRESS=" TO CONSOLE CALL MSG CALL PARAM MEM1: CALL DSPYM CALL CECHO CP 00DH JP Z,MNTR CP 020H JP Z,MEM9 CP 05EH JP Z,MEM10 CALL BYTC1 LD (HL),A CP (HL) JP Z,MEM9 LD C,' ' CALL CO LD C,'E' CALL CO MEM9: INC HL JP MEM1 MEM10: DEC HL JP MEM1 ; ; ; ;KEY-BOARD INTERRUPT ROUTINE,KEYED WITH "SPACE-BAR" ; KBINT: IN A,(07H) AND CRRDY RET Z IN /ALTER,IF "M" CP 'G' JP Z,GO ;JUMP TO GO TO MEMORY ADDRESS,IF "G" CP 'T' JP Z,MEMTS ;JUMP TO MEMORY TEST START,IF "T" LER: CALL CRLF ;KEEP IT NEAT LD C,'?' ;LINE INPUT ERROR,OUTPUT "?" TO CONSOLE CALL CO JP MNTR ; ; ; CECHO: CALL CI LD C,A CALL CO RET ; ; ; GO: LD HL,MSG2 ;OUTPUT "GO ADDRESS=" TO CONSOLE CALL MSG CALL PARAM CALL CRLF JP (HL) ; ; ; PARAM: LD HL,0 PARM1: CALL CECHO CP 0DH RET Z ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL JP C,LER CAL CYCLE TEST' ; CKMSG: DEFB 25,0DH,0AH,'CHECKING DATA RETENTION' ; CLMSG: DEFB 24,0DH,0AH,'GALLOPING COLUMNS TEST' ; RDMSG: DEFB 22,0DH,0AH,'RANDOM PATTERNS TEST' ; SATSG: DEFB 23,0DH,0AH,'WRITE SATURATION TEST' ; WMSG: DEFB 23,0DH,0AH,'WALKING PATTERNS TEST' ; NDMSG: DEFB 27,0DH,0AH,0AH,'NO MEMORY BLOCKS DROPPED' ; DMMSG: DEFB 27,0DH,0AH,0AH,'DROPPED MEMORY BLOCK(S)=' ; LMMSG: DEFB 22,0DH,0AH,0AH,'LOW MEMORY ADDRESS=' ; HMMSG: DEFB 22,0DH,0AH,'HIGH MEMORY ADDRESS=' ; NAMSG: DEFB 24,0DH,0 LD A,C OUT (CDATA),A RET ; ; ; INIT: IN A,(1CH) SET 6,A OUT (1CH),A LD HL,01000H ;SET DELAY COUNT FOR 6850 SETTLE TIME DELAY: DEC HL LD A,H OR L JP NZ,DELAY LD HL,MSGN CALL MSG TOP: LD HL,MSG7 ;OUTPUT "TOP OF MEMORY=" TO CONSOLE CALL MSG LD HL,00FFFH ;SET BASE ADDRESS OF TEST RAM -1 FIND: INC HL ;EXAMINE EACH BYTE LD A,H OR A JP Z,FIND1 LD A,(HL) CPL LD (HL),A CP (HL) JP Z,FIND FIND1: DEC HL CALL HLOUT LD HL,QTMSG ;OUTPUT "MEMORY QUALIFICATION TEST A,(05H) AND 07FH ;MASK-OFF PARITY BIT CP 020H ;GOT A "SPACE-BAR"? JP Z,MNTR ;GO TO COMMAND MONITOR,IF SO RET ; ; ; SP5: LD C,20H CALL CO SP4: LD C,20H CALL CO SP3: LD C,20H CALL CO SP2: LD C,20H CALL CO SP1: LD C,20H CALL CO RET ; ; ; ; ; ; MSGN: DEFB 71,0DH,0AH,'MICROCOSM ASSOCIATES "SUPER MEMORY DIAGNOSTIC"' DEFB ' VERSION 1.01 (C) 1979' ; MSG1: DEFB 14,'EMORY ADDRESS=' ; MSG2: DEFB 10,'O ADDRESS=' ; MSG7: DEFB 17,0DH,0AH,0AH,'TOP OF MEMORY=' ; QTMSG: DEL NBL JP C,LER OR L LD L,A JP PARM1 ; ; ; BYTEC: CALL CECHO BYTC1: CALL NBL JP C,LER RLCA RLCA RLCA RLCA PUSH AF CALL CECHO CALL NBL JP C,LER POP BC OR B RET ; ; ; BYTEO: PUSH AF CALL BYTO1 LD C,A CALL CO POP AF CALL BYTO2 LD C,A JP CO BYTO1: RRCA RRCA RRCA RRCA BYTO2: AND 0FH CP 0AH JP M,BYTO3 ADD A,7 BYTO3: ADD A,30H RET ; ; ; HLCO: CALL CRLF HLOUT: LD A,H CALL BYTEO LD A,L CALL BYTEO RET ; ; ; DSPYM: CALL AH,'INVALID MEMORY ADDRESS' ; OPMSG: DEFB 20,0DH,0AH,0AH,'TEST OPTIONS ARE:' ; TMSG1: DEFB 30,0DH,0AH,0DH,0AH,'01-GALLOPING PATTERNS TEST' ; TMSG2: DEFB 27,0DH,0AH,'02-GALLOPING COLUMNS TEST' ; TMSG3: DEFB 26,0DH,0AH,'03-WALKING PATTERNS TEST' ; TMSG4: DEFB 25,0DH,0AH,'04-RANDOM PATTERNS TEST' ; TMSG5: DEFB 26,0DH,0AH,'05-WRITE SATURATION TEST' ; TMSG6: DEFB 28,0DH,0AH,'06-STATIC CHECK CYCLE TEST' ; TMSGN: DEFB 44,0DH,0AH,0AH,'ENTER TEST NUMBER (01,02,03,04,05 OR 06)=' ; EPMSG: DEFB 24,0DH ; IS IN PROGRESS" TO CONSOLE CALL MSG LD HL,01000H ;SET MEMORY "BOTTOM" ADDRESS LD (MBOT),HL LD HL,0F000H ;SET MEMORY "TOP" ADDRESS LD (MTOP),HL LD HL,TEST ;SAVE "FUNKY RETURN" ADDRESS LD (MTEST),HL JP RNDSL ;GO DO RANDOM PATTERNS TEST ON 16K BYTE MEMORY TEST: LD SP,STACK ;RE-SET THE STACK JP MEMTS ; ; ; MNTR: LD SP,STACK CALL CRLF LD C,'-' ;OUTPUT PROMPT (- CHARACTER) CALL CO CALL CECHO ;ECHO KEY-BOARD INPUT OUT TO CONSOLE CP 'M' JP Z,MEM ;JUMP TO MEMORY DISPLAYFB 43,0DH,0AH,0AH,'MEMORY QUALIFICATION TEST IS IN PROGRESS' ; AMMSG: DEFB 39,0DH,0AH,0AH,'TEST MEMORY IN "AUTO" MODE (Y OR N)?' ; DFMSG: DEFB 47,0DH,0AH,0AH,'TEST "ALL","SELECT",OR "MONITOR" (A,S OR M)?' ; TPMSG: DEFB 20,' TEST IS IN PROGRESS' ; TMSG: DEFB 17,0DH,0AH,0AH,'TESTING MEMORY' ; FMSG: DEFB 6,',FROM ' ; TOMSG: DEFB 4,' TO ' ; PSMSG: DEFB 7,0DH,0AH,'PASS=' ; ERMSG: DEFB 15,', TOTAL ERRORS=' ; PTSG: DEFB 25,0DH,0AH,'GALLOPING PATTERNS TEST' ; RFMSG: DEFB 25,0DH,0AH,'STATIC CHECK  ,0AH,0AH,'ENTER PATTERN(00-FF)=' ; REMSG: DEFB 29,0DH,0AH,'RETENTION ERROR AT ADDRESS=' ; EXMSG: DEFB 31,0DH,0AH,'EXPECTED "00" DATA,READ BACK ' ; MRER1: DEFB 20,0DH,0AH,'ERROR AT ADDRESS=',0 ; MRER2: DEFB 12,' READ BACK ' ; MRER3: DEFB 11,' ,EXPECTED ' ; MRER4: DEFB 27,0DH,0AH,'LAST ADDRESS WRITTEN WAS ' ; MRER5: DEFB 14,20H,',PATTERN WAS ' ; MRER6: DEFB 26,0DH,0AH,'ERROR READING OTHER CELL' ; MRER7: DEFB 25,0DH,0AH,'ERROR READING TEST CELL' ; MRER8: DEFB 12,0DH,0AH,'TEST CELL=' ; MROP COUNT INC (HL) LD HL,(MEMPT) ;GET THE MEMORY BLOCK POINTER DEC HL ;BACK-UP TO MEMORY BLOCK JUST TESTED,AND LOG IT OUT LD (HL),000H AUTO3: LD A,9 ;SET ERROR DISPLAY COUNTER TO 8 PLUS 1 LD (ERCNT),A XOR A ;CLEAR ERROR FLAG LD (ERFLG),A LD HL,(MEMPT) ;GET MEMORY BLOCK AND BLOCK NUMBER LD A,(HL) INC HL ;UPDATE AND SAVE NEW POINTER LD (MEMPT),HL OR A ;TEST THE MEMORY BLOCK NUMBER JP M,AUTO0 ;RE-START IF "END" OF BUFFER JP Z,AUTO3 ;TRY NEXT ONE,IF DROPPED MEMORY BLOCK RLO ;DO AUTO MODE,IF YES CP 'N' JP Z,SELCT ;LET OPERATOR SELECT,IF NO JP AUT ;OOPS...GAVE HIM TWO CHOICES,AND HE PICKED THIRD AUTO: CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT LD HL,DROP ;SET-UP DROP LIST POINTER LD (DROPP),HL ;SET DROP LIST POINTER TO START XOR A ;CLEAR DROP COUNT AND ERROR FLAG DEC HL LD (HL),A DEC HL LD (HL),A AUTO0: LD HL,MBUF ;POINT TO MEMORY BUFFER LD (MEMPT),HL ;SAVE MEMORY POINTER FOR LOOPING AUTO1: LD A,(ERFLG) ;GET ERROR FLAG,TO SEE IF WE DROP MEMORY MEMORY TEST ; ; ; ;ROUTINE TO DO WRITE AMPLIFIER SATURATION TEST IN "AUTO MODE" ; WRTSAT: LD SP,STACK ;SET THE STACK POINTER LD HL,SATSG ;OUTPUT "WRITE SATURATION TEST" TO CONSOLE CALL MSG LD HL,(BLKST) ;GET MEMORY BLOCK STARTING ADDRESS LD (MBOT),HL ;SAVE AS MEMORY BOTTOM ADDRESS LD HL,(MEND) ;GET MEMORY BLOCK END ADDRESS LD (MTOP),HL ;SAVE A MEMORY "TOP" ADDRESS LD B,100 ;SET-UP FOR 100 WRITE SATURATION PASSES XOR A ;SATURATE WITH 0'S FIRST CALL SAT ;WRITE WITH PATTERN,100 TIMESER9: DEFB 13,', OTHER CELL=' ; MER10: DEFB 18,20H,20H,'PATTERN STORED=',0 ; MER11: DEFB 16,20H,20H,'PATTERN READ=',0 ; MER12: DEFB 19,0DH,0AH,'BIT(S) IN ERROR=',0 ; ; ; ; ; MSG: PUSH AF PUSH BC LD B,(HL) INC HL MSGA: LD C,(HL) CALL CO INC HL DEC B JP NZ,MSGA POP BC POP AF RET ; ; ; ; ; ; ;ROUTINE TO FIND ALL 4K MEMORY BLOCKS AVAILABLE TO SYSTEM ; MEMTS: LD HL,00000H ;CLEAR THE PASS AND ERROR COUNTERS LD (PCTR),HL LD (ECTR),HL LD BC,MBUF ;POINT TO MEMORY BUFFCA ;CONVERT MEMORY BLOCK NUMBER TO 4K BLOCK ADDRESS RLCA RLCA RLCA LD L,000H ;ZERO L REG. LD H,A ;MAKE A 16 BIT BLOCK ADDRESS OUT OF THIS, ; AND SAVE AS BLOCK STARTING ADDRESS LD (BLKST),HL ADD A,010H ;ADD 4K TO START LD H,A LD (MEND),HL ;SAVE AS MEMORY BLOCK END ADDRESS +1 LD HL,AUTO1 ;SAVE "AUTO1" FOR LOOPING ADDRESS LD (AUTOR),HL LD HL,TMSG ;OUTPUT "TESTING MEMORY " TO CONSOLE CALL MSG LD HL,FMSG ;OUTPUT ", FROM " TO CONSOLE CALL MSG LD HL,(BLKST) ;GET THE MEMO ; BLOCK JUST TESTED OR NOT OR A JP Z,AUTO3 ;IF NOT ZERO,DROP THIS BLOCK FROM TEST LD HL,(DROPP) ;POINT TO NEXT DROP LIST SLOT EX DE,HL LD HL,(BLKST) ;GET MEMORY BLOCK START ADDRESS EX DE,HL ;AND NOW WE HAVE H&L REGS.AS DROP LIST POINTER, ; AND D&E REGS. AS THE BLOCK START LD (HL),E ;SAVE LOW BYTE OF BLOCK START INC HL LD (HL),D ;SAVE HIGH BYTE OF BLOCK START INC HL ;GET H&L REGS. TO POINT TO NEXT DROP LIST SLOT LD (DROPP),HL ;SAVE THE NEW POINTER LD HL,DROPC ;+1 TO THE DR LD A,0FFH ;FLIP PATTERN TO 1'S CALL BAKPT ;WRITE 1 TIME ONLY CALL SATRD ;DO SATURATION READ LD B,100 ;AGAIN SET-UP 100 WRITE SATURATION PASSES LD A,0FFH ;NOW SATURATE WITH 1'S CALL SAT ;WRITE WITH PATTERN,100 TIMES XOR A ;FLIP PATTERN TO 0'S CALL BAKPT ;WRITE 1 TIME ONLY CALL SATRD ;DO SATURATION READ JP GAL ;GO DO "GALLOPING PATTERNS" MEMORY TEST ; ; ; ;ROUTINE TO DO WRITE SATURATION TEST IN "SELECT MODE" ; WSATT: LD B,100 ;SET-UP FOR 100 WRITE SATURATION PASSES CALLER LD E,1 ;SET-UP BASE RAM 1ST 4K BYTE TEST ADDRESS STAAD: LD A,E LD (BC),A ;SAVE IT IN BUFFER INC BC INC4K: LD A,00BH ;INCREMENT TO NEXT 4K MEMORY BLOCK,STOP IF ALL ; MEMORY BLOCKS TRIED,FOR 16 K BYTE MEMORY INC E ;BUMP FOR NEXT MEMORY BLOCK CP E ;ALL DONE? JP P,STAAD ;IF NOT,GO TEST THIS NEW MEMORY BLOCK LD A,080H ;YES,TAG WITH "END" IN BUFFER LD (BC),A AUT: LD HL,AMMSG ;OUTPUT "TEST MEMORY IN "AUTO" MODE (Y OR N)?" CALL MSG CALL CECHO ;GET THE ANSWER CP 'Y' JP Z,AUTRY BLOCK STARTING ADDRESS CALL HLOUT LD HL,TOMSG ;OUTPUT " TO " TO CONSOLE CALL MSG LD HL,(MEND) ;GET THE MEMORY ENDING ADDRESS CALL HLOUT LD HL,PSMSG ;OUTPUT "PASS=" TO CONSOLE CALL MSG LD HL,(PCTR) ;GET THE PASS COUNTER,AND UPDATE IT INC HL LD (PCTR),HL CALL HLOUT LD HL,ERMSG ;OUTPUT ", ERRORS TOTAL=" TO CONSOLE CALL MSG LD HL,(ECTR) ;GET THE ERROR COUNTER,AND SHOW IT ALSO CALL HLOUT LD HL,WRTSAT ;SAVE "NEXT TEST" ADDRESS LD (MTEST),HL JP RANPT ;GO DO RANDOM PATTERNS    SAT ;WRITE WITH SELECTED PATTERN,100 TIMES CPL ;WRITE WITH COMPLEMENT,1 PASS CALL BAKPT CALL SATRD ;READ THE DATA LD A,(TPATT) ;GET SAVED TEST PATTERN LD B,100 ;NOW DO COMPLEMENT 100 TIMES CALL SAT ;....AND WE'RE OFF CPL ;WRITE WITH COMPLEMENT,1 PASS CALL BAKPT CALL SATRD ;READ THE DATA RET ; ; ; ;SUBROUTINE TO READ 1 PASS "BACKGROUND" PATTERN AS CONTAINED IN A REG. ; SATRD: LD HL,(MTOP) ;GET MEMORY "TOP" ADDRESS EX DE,HL ;SWAP H&L REGS. TO D&E REGS. LD HL,(MBOT) ;TILL BE FF HEX AND THEN 00 HEX) ; GAL: LD HL,PTSG ;OUTPUT "GALLOPING PATTERN MEMORY TEST" TO CONSOLE CALL MSG LD HL,(BLKST) ;GET MEMORY BLOCK STARTING ADDRESS GAL1: LD (MBOT),HL ;SAVE AS "CHUNK" START INC H ;ADD 256 LD L,000H ;CLEAN-UP L REG. LD (MTOP),HL ;SAVE AS "CHUNK" END +1 LD A,0FFH ;ALL ONES BACK-GROUND PATTERN CALL GALPT ;TEST THE "CHUNK" WITH 1'S XOR A ;ALL ZEROS BACK-GROUND PATTERN CALL GALPT ;TEST THE "CHUNK" WITH 0'S LD HL,(MEND) ;GET "CHUNK" AND MEMORY BLOCK END CERRORS,IF SO LD (ERCNT),A LD HL,MRER1 ;OUTPUT " ERROR AT ADDRESS=" TO CONSOLE CALL MSG POP HL ;GET BAD BYTE ADDRESS,BUT DON'T ; CHANGE THE STACK PUSH HL CALL HLOUT LD HL,MRER2 ;OUTPUT " READ BACK " TO CONSOLE CALL MSG LD A,(ERPAT) ;GET ERROR PATTERN CALL BYTEO ;SHOW IT LD HL,MRER3 ;OUTPUT " , EXPECTED " TO CONSOLE JP SATX ;DISPLAY EXPECTED DATA PATTERN AND EXIT ; ; ; ;ROUTINE TO DO STATIC CHECK CYCLE TEST IN "SELECT MODE" ; STATT: LD A,0FFH ;ALL 1'S PATTERN FOR FIRST PORR FUTURE USE IN "GALLOPING COLUMN" LD A,0FFH ;SET-UP ALL ONES PATTERN CALL GALCL ;DO "GALLOPING COLUMN" XOR A ;SET-UP ALL ZEROS PATTERN CALL GALCL ;TEST THE MEMORY BLOCK AGAIN ; ; ; ;ROUTINE TO WALK PATTERNS THRU THE MEMORY BLOCK IN 256 BYTE "CHUNKS", ; (WRITES 1'S,WALKS 0'S,THEN WRITES 0'S,AND THEN WALKS 1'S) ; WALK: LD HL,WMSG ;OUTPUT "WALKING PATTERNS MEMORY TEST" TO CONSOLE CALL MSG LD HL,(BLKST) ;GET MEMORY BLOCK STARTING ADDRESS WALK1: LD (MBOT),HL ;SAVE AS "CHUNK" STARTING AOP'S IN D&E REGS.,BOTTOM'S IN H&L REGS. LD B,A ;SAVE PATTERN IN B REG. LD (TPATT),A ;SAVE DATA PATTERN FOR POSSIBLE ERROR DISPLAY FSTRD: CALL COMP ;ALL DONE? RET Z LD A,(HL) ;GET A BYTE FROM MEMORY CP B ;GOT A MATCH? CALL NZ,SATER ;INDICATE "WRITE SATURATION" ERROR IF NO MATCH INC HL ;BUMP POINTER FOR NEXT BYTE JP FSTRD ;DO FAST READ ON MORE MEMORY ; ; ; SAT: PUSH AF ;EXILE THE A REG. CALL KBINT ;CHECK KEY-BOARD INTERRUPT POP AF ;BACK FROM EXILE PUSH BC ;SAVE PASSES ON SALL COMP ;HAVE WE DONE ALL 16 "CHUNKS" IN THE MEMORY BLOCK? JP Z,STATIC ;IF DONE,GO DO 1 MINUTE STATIC TEST EX DE,HL ;OH...GO DO NEXT "CHUNK" IN SAME MEMORY BLOCK JP GAL1 ; ; ; STATIC: LD HL,RFMSG ;OUTPUT "STATIC CHECK CYCLE" TO CONSOLE CALL MSG LD BC,500 CALL LOOP1 ;DO ONE MINUTE DELAY FOR STATIC CHECK LD HL,CKMSG ;OUTPUT "CHECKING DATA RETENTION" TO CONSOLE CALL MSG LD HL,(MEND) ;GET MEMORY BLOCK END EX DE,HL ;SWAP TO D&E REGS. LD HL,(BLKST) ;GET MEMORY BLOCK STARTING ADDRESSTION OF TEST PUSH AF ;SAVE THE PATTERN CALL BAKPT ;WRITE IT LD BC,500*5 ;DO 5 MINUTE DELAY "DO NOTHING" CALL LOOP1 POP AF ;GET PATTERN CALL SATRD ;READ AFTER DELAY TIME XOR A ;ALL 0'S PATTERN FOR SECOND PORTION OF TEST PUSH AF ;SAVE THE PATTERN CALL BAKPT ;WRITE IT LD BC,500*5 ;DO 5 MINUTE DELAY "DO NOTHING" CALL LOOP1 POP AF ;GET PATTERN CALL SATRD ;CHECK DATA AFTER 5 MINUTE DELAY RET ; ; ; ;ROUTINE TO DO "GALLOPING" MEMORY TEST IN 256 BYTE CHUNKS ; (MEMORY DATA WDDRESS INC H ;ADD 256 LD L,000H ;SCRUB L REG. LD (MTOP),HL ;SAVE RESULT AS "CHUNK" END +1 LD A,0FFH ;MAKE AN ALL 1'S PATTERN BYTE CALL WALKT ;LET'S GO FOR A WALK XOR A ;MAKE AN ALL 0'S PATTERN BYTE CALL WALKT ;MAYBE WE COULD JOG FOR AWHILE? LD HL,(MEND) ;GET "CHUNK" AND BLOCK END CALL COMP ;ALL THE "CHUNKS" DONE IN THE BLOCK? JP Z,TEND ;IF ZERO,GO TO NEXT MEMORY BLOCK IN AUTO SEQUENCE EX DE,HL ;NO? GET NEW "CHUNK" START ADDRESS JP WALK1 ;GO TEST NEW "CHUNK" TEND: CALLTACK CALL BAKPT ;WRITE THE "BACKGROUND" PATTERN POP BC ;GET PASS COUNT DEC B ;DE-BUMP THE PASS COUNT JP NZ,SAT ;CONTINUE WRITING 'TILL 100 PASSES COMPLETED RET ; ; ; ;SUBROUTINE TO INDICATE ERROR IN WRITE SATURATION TEST ; SATER: LD (ERPAT),A ;SAVE "BAD" BYTE LD A,0FFH ;SET ERROR FLAG LD (ERFLG),A PUSH HL ;SAVE BAD BYTE ADDRESS LD HL,(ECTR) ;UPDATE THE ERROR COUNTER INC HL LD (ECTR),HL LD A,(ERCNT) ;DONE DISPLAYING ALL ERRORS? DEC A JP Z,PTX ;DON'T DISPLAY ANY MORE  XOR A ;MAKE A 0'S BYTE FOR COMPARE LOOP3: CP (HL) ;TEST "GALLOPING PATTERN" RESULT BYTE CALL NZ,RFERR ;IF IT DIDN'T SURVIVE,REPORT RETENTION ERROR INC HL ;BUMP FOR NEXT TEST BYTE CALL COMP ;HAVE WE CHECKED THE WHOLE MEMORY BLOCK? JP C,LOOP3 ;IF NOT,DO IT LD HL,CLMSG ;OUTPUT "GALLOPING COLUMN MEMORY TEST" TO CONSOLE CALL MSG LD HL,(BLKST) ;GET MEMORY BLOCK START LD (MBOT),HL ;SAVE IT FOR FUTURE USE IN "GALLOPING COLUMN" LD HL,(MEND) ;GET MEMORY BLOCK END LD (MTOP),HL ;SAVE FO   CDROP ;SHOW ANY "DROPPED BLOCKS" LD HL,(AUTOR) ;GET "AUTO1" RETURN ADDRESS JP (HL) ;GO FOR IT ; ; ; ;ROUTINE TO DO RANDOM MEMORY TEST IN "SELECT MODE" ; RNDSL: LD HL,(MTOP) ;GET OPERATOR SELECTED MEMORY "TOP" ADDRESS LD B,H ;SAVE IT IN B&C REGS. LD C,L DEC BC ;DE-BUMP B&C REGS. TO GET PROPER "TOP" ; MEMORY BOUNDRY ADDRESS LD HL,(MBOT) ;GET OPERATOR SELECTED MEMORY "BOTTOM" ADDRESS JP RANST ;GO TO RANDOM PATTERNS TEST START ; ; ; ;ROUTINE TO DO RANDOM PATTERNS MEMORY TEST D (HL),A INC HL LD A,C SUB L LD A,B SBC A,H JP C,DONE2 DEC HL LD A,(HL) RLCA RLCA RLCA DEC HL XOR (HL) RRCA RRCA AND 1 XOR (HL) INC HL INC HL CP (HL) JP NZ,ERROR INC HL LD A,C SUB L LD A,B SBC A,H JP C,DONE2 DEC HL DEC HL LD A,(HL) INC HL INC HL CP (HL) JP NZ,ERROR JP CHKR ; ; ; ;"DONE2" CHECKS TO SEE WHICH TEST HAS JUST BEEN DONE. IF IT WAS ;THE FIRST TEST THEN IT SETS UP TO TEST THE COMPLIMENT, ELSE IT ;SETS UP FOR THE FINALSUBTRACT LOW BYTE OF TEST CELL LD A,B ;GET HIGH BYTE OF MEMORY TOP ADDRESS, ; AND SAVE CARRY ONLY SBC A,H ;SUBTRACT HIGH BYTE OF TEST CELL ADDRESS JP C,DONE1 ;IF WE GOT THE CARRY,WERE DONE DEC SP ;NO,NOT DONE YET DEC SP POP HL LD A,L ;MAKE MORE "HASH" FOR MEMORY PATTERNS ADD A,A LD L,A LD A,H RLA LD H,A LD A,0 ADC A,L LD L,A LD A,H RLCA RLCA RLCA XOR L RRCA RRCA AND 1 XOR L LD L,A JP STORR ; ; ; ;"DONE1" CHECKS THE FIRST TWO BYTES FOR E,(BC) AND A JP NZ,AR1 ;CHECKS FOR '0' END OF MESSAGE FLAG JP (HL) AR1: IN A,(CCTRL) AND CTRDY JP Z,AR1 ;CHECK IF CONSOLE READY LD A,(BC) OUT (CDATA),A INC BC ;OUTPUT CHARACTER JP MSGOUT ; ; ; ;THE "ERROR" ROUTINE PRINTS OUT THAT THERE HAS BEEN AN ERROR AT ;THE ADDRESS IN THE H&L REGISTERS.IT THEN TELLS THAT THE TEST ;BYTE IS THE BYTE IN THE ACCUMULATOR AND THE ERROR BYTE IS THE ;BYTE POINTED TO BY THE H&L REGISTERS.FINALLY IT PRINTS OUT THE ;BITS THAT ARE IN DISAGREEMENT IN THEIN "AUTO MODE" ; RANPT: LD HL,RDMSG ;OUTPUT "RANDOM PATTERNS MEMORY TEST" TO CONSOLE CALL MSG RANMT: LD HL,(MEND) ;GET MEMORY BLOCK END ADDRESS INTO B&C REGS. LD B,H LD C,L DEC BC ;DE-BUMP B&C REGS. TO GET PROPER BLOCK END ; BOUNDRY ADDRESS DEC BC DEC BC LD HL,(BLKST) ;GET MEMORY BLOCK START ADDRESS INTO H&L REGS., ; AND D&E REGS. RANST: LD D,H LD E,L LD SP,HL ;STUFF H&L REGS. INTO SP REG. LD HL,1 ;MAKE A STARTING "SEED" FOR FIRST RANDOM PATTERN ; ; ; ;"STORR", STORES RAND FOUR TESTS ; DONE2: LD L,E LD H,D LD SP,HL LD HL,0FFFEH LD A,(DE) CP 2 JP Z,STORR LD L,E LD H,D LD DE,0AA55H ; ; ; ;"STOAL" STORES THE TWO BYTES IN THE D&E REGISTERS (AA HEX AND 55 HEX) ;THROUGHOUT THE TEST AREA ; STOAL: LD (HL),D INC HL LD (HL),E INC HL LD A,C SUB L LD A,B SBC A,H JP NZ,STOAL LD HL,0 ADD HL,SP ; ; ; ;"CHKAL" TEST TO SEE IF THE DATA STORED THROUGHOUT MEMORY IS THE ;SAME AS THE D&E REGISTERS ; CHKAL: LD A,D LD D,E LD E,A CP (HL) RRORS AND ALSO CHECKS ;TO SEE WHICH PASS-THROUGH THE PROGRAM IS ON. ; DONE1: LD L,E LD H,D LD A,1 CP (HL) JP NZ,CHECK DEC A INC HL CP (HL) JP NZ,ERROR JP CHKR ; ; ; CHECK: LD A,0FEH CP (HL) LD A,1 JP NZ,ERROR DEC A DEC A INC HL CP (HL) JP NZ,ERROR ; ; ; ;"CHKR" GOES BACK AND CHECKS TO SEE IF WHAT IS STORED ;THROUGHOUT MEMORY,IS STILL THE SAME AS WHEN IT WAS STORED. ; CHKR: LD A,(HL) RLA DEC HL LD A,(HL) RLA LD (HL),A INC HL LD A,(HL) RLA L TWO BYTES. ; ERROR: LD SP,HL LD A,0FFH ;SET ERROR FLAG LD (ERFLG),A LD A,(ERCNT) ;DONE SHOWING 8 ERRORS? DEC A JP Z,ER9 LD (ERCNT),A LD HL,ER1 LD D,A LD BC,MRER1 ;OUTPUT "ERROR AT ADDRESS=" TO CONSOLE JP MSGOUT ; ER1: LD HL,0 ADD HL,SP LD B,D EX DE,HL LD HL,ER2 JP OUTER ; ER2: LD D,E LD HL,ER3 JP OUTER ; ER3: LD D,B LD BC,MER10 ;OUTPUT "PATTERN STORED=" TO CONSOLE LD HL,ER4 JP MSGOUT ; ER4: LD HL,ER5 JP OUTER ; ER5: LD BC,MER11 ;OUTPUT "PATTERN READ=" OM NUMBERS THROUGHOUT THE MEMORY TEST AREA BY ;USING RANDOM NUMBERS,CAUSING MOST PATTERN SENSITIVE AND ADDRESSING ;PROBLEMS TO BE CAUGHT.THE NUMBERS ARE STORED USING THE ;8080/8085 "PUSH" COMMAND WHICH STORES TWO ADJACENT BYTES IN THE ;FASTEST MANNER POSSIBLE. ; STORR: INC SP ;BUMP STACK POINTER BY 2'S INC SP PUSH HL ;STUFF THE RANDOM DATA BYTE INTO MEMORY POP HL LD HL,0 ;SCRUB H&L REGS. ADD HL,SP ;GET THE CURRENT TEST CELL ADDRESS LD A,C ;GET LOW BYTE OF MEMORY TOP ADDRESS SUB L ;JP NZ,ERROR INC HL LD A,C SUB L LD A,B SBC A,H JP NZ,CHKAL ; ; ; ;THIS ROUTINE FINDS OUT WHICH PASS THE TEST IS ON, ;AND THEN SETS UP TO DO THE NEXT TEST ; LD HL,0 ADD HL,SP LD DE,055AAH LD A,(HL) CP 0AAH JP Z,STOAL LD DE,0FFFFH CP 055H JP Z,STOAL LD DE,0 INC A JP Z,STOAL LD HL,(MTEST) ;GO DO NEXT MEMORY TEST,WERE DONE HERE JP (HL) ; ; ; ;THIS ROUTINE PRINTS OUT WHAT IS POINTED TO IN MEMORY BY ;THE B&C REGISTERS UNTIL A ZERO BYTE IS FOUND. ; MSGOUT: LD A  TO CONSOLE LD HL,ER6 JP MSGOUT ; ER6: LD HL,0 ADD HL,SP LD E,D LD D,(HL) LD HL,ER7 JP OUTER ; ER7: LD BC,MER12 ;OUTPUT "BITS IN ERROR=" TO CONSOLE LD HL,ER8 JP MSGOUT ; ER8: LD D,0 LD B,1 LD HL,0 ADD HL,SP LD A,E XOR (HL) LD E,A ; LOP: INC D LD A,E RRA LD E,A JP NC,NOERR ; DEC B JP Z,LOPE LUPE: IN A,(CCTRL) AND CTRDY JP Z,LUPE LD A,',' OUT (CDATA),A LOPE: IN A,(CCTRL) AND CTRDY JP Z,LOPE LD A,D ADD A,2FH OUT (CDATA),A NOERR: LD A,D CADDRESS" TO CONSOLE CALL MSG JP SEL ;GIVE'M ANOTHER CHANCE SEL0: LD (MBOT),HL ;SAVE IT AS MEMORY "BOTTOM" ADDRESS LD HL,HMMSG ;OUTPUT "HIGH MEMORY ADDRESS=" TO CONSOLE CALL MSG CALL PARAM ;GET IT FROM OPERATOR EX DE,HL ;SWAP TO D&E REGS. LD A,D ;GET THE HIGH BYTE OF "TOP" MEMORY ADDRESS LD HL,(MBOT) ;GET MEMORY "BOTTOM" ADDRESS CP H ;IS THE TOP < BOTTOM? JP NC,STOTOP ;IF NOT,STORE THE "TOP" FOR SAFE KEEPING LD HL,NAMSG ;ARE YOU POSSIBLY ATTEMPTING TO TRY MY PATIENCE? CALL MSG  DROPPED MEMORY BLOCK CALL HLOUT EX DE,HL ;SWAP'EM POP AF ;GET THE DROP COUNT DEC A ;DE-BUMP IT JP NZ,EDROP ;DO THEM ALL RET ; ; ; ;"SELECT" MODE ROUTINE (OPERATOR DEFINES ADDRESS RANGE,PATTERN,AND TEST) ; SELCT: LD A,0FFH ;SET ERROR DISPLAY COUNT TO 256 LD (ERCNT),A LD HL,SELCT ;MAKE A RETURN ADDRESS FOR END OF TEST LD (MTEST),HL MENU: LD HL,DFMSG ;OUTPUT "TEST "ALL","SELECT",OR "MONITOR" (Y OR N)?" ; TO CONSOLE CALL MSG CALL CECHO ;GET THE ANSWER CP 'A' ;"ALL" CHOTTERN(00-FF)=" TO CONSOLE CALL MSG CALL CONI ;GET THE REQUESTED PATTERN LD C,A ;SAVE IT IN C REG. PUSH BC ;EXILE THE TEST NUMBER LD HL,TPMSG ;OUTPUT " TEST IS IN PROGRESS" TO CONSOLE CALL MSG POP BC ;FROM WHENCE THY CAME... LD DE,SELCT ;GO BACK TO "SELECT MODE" AFTER TEST COMPLETION PUSH DE DEC B ;ADJUST THE TEST NUMBER FOR THE TABLE JUMP LD A,B RLCA ADD A,B LD E,A LD D,000H ;MAKE A 16 BIT INDEX LD HL,BTAB ;GET THE TABLE BASE LD A,C ;GET BACK THE SAVED PATTERN AP 8 JP NZ,LOP ER9: LD HL,(ECTR) ;UPDATE THE ERROR COUNTER INC HL LD (ECTR),HL LD HL,(MTEST) ;RETURN JP (HL) ; ; ; OUTER: IN A,(CCTRL) AND CTRDY JP Z,OUTER LD A,D RLCA RLCA RLCA RLCA AND 0FH CP 0AH JP C,OUTR1 ADD A,7 OUTR1: ADD A,'0' OUT (CDATA),A OUTR2: IN A,(CCTRL) AND CTRDY JP Z,OUTR2 LD A,D AND 0FH CP 0AH JP C,OUTR3 ADD A,7 OUTR3: ADD A,'0' OUT (CDATA),A JP (HL) ; ; ; ; ; ; ;ROUTINE TO SHOW THE "DROP LIST" TO THE OPERATOR ; CDROP: L JP SELCT ;TRY AGAIN,AND AGAIN,AND AGAIN,AND....... STOTOP: EX DE,HL ;GET THE "TOP" BACK TO H&L REGS. INC HL ;GO ONE PAST THE END,AND SAVE IT LD (MTOP),HL SEL1: LD HL,OPMSG ;OUTPUT "TEST OPTIONS ARE:" TO CONSOLE CALL MSG LD HL,TMSG1 ;OUTPUT " 01-GALLOPING PATTERNS TEST" TO CONSOLE CALL MSG LD HL,TMSG2 ;OUTPUT " 02-GALLOPING COLUMNS TEST" TO CONSOLE CALL MSG LD HL,TMSG3 ;OUTPUT " 03-WALKING PATTERNS TEST" TO CONSOLE CALL MSG LD HL,TMSG4 ;OUTPUT " 04-RANDOM PATTERNS TEST" TO CONSOLE SEN? JP Z,ALL CP 'S' ;"SELECT" CHOSEN? JP Z,SEL CP 'M' ;"MONITOR" CHOSEN? JP Z,MNTR JP MENU ;OOPS...NONE OF THE ABOVE,TRY AGAIN ALL: LD HL,01000H ;SET MEMORY "BOTTOM" LD (MBOT),HL LD HL,0C000H ;SET MEMORY "TOP" LD (MTOP),HL JP SEL1 ;TEST "ALL"..... SEL: LD HL,LMMSG ;OUTPUT "LOW MEMORY ADDRESS=" TO CONSOLE CALL MSG CALL PARAM ;GET IT FROM OPERATOR LD A,H ;IS THE REQUESTED ADDRESS <1000 HEX? CP 010H JP NC,SEL0 LD HL,NAMSG ;OOPS...NOT ALLOWED,OUTPUT "INVALID ; MEMORY DD HL,DE ;GET H&L REGS. TO EQUAL THE ADRESS OF THE JUMP JP (HL) ;GO FOR IT BTAB: JP GALPT ;GO DO "GALLOPING PATTERNS TEST" JP GALCL ;GO DO "GALLOPING COLUMNS TEST" JP WALKT ;GO DO "WALKING PATTERNS TEST" JP RNDSL ;GO DO "RANDOM PATTERNS TEST" JP WSATT ;GO DO "WRITE SATURATION TEST" JP STATT ;GO DO "STATIC CHECK CYCLE TEST" RET ;THIS SHOULD'NT GET USED ; ; ; ;SUBROUTINE TO INDICATE RETENTION ERROR (GALLOPING PATTERN BAD AFTER 1 MINUTE) ; RFERR: CPL ;MAKE ERROR FLAG NOND A,(DROPC) ;GET THE DROP COUNT OR A ;DID WE LOSE ANYBODY? JP NZ,PDROP LD HL,NDMSG ;OUTPUT "NO MEMORY BLOCKS DROPPED" TO CONSOLE CALL MSG RET PDROP: LD HL,DROP ;POINT TO START OF THE DROP LIST EDROP: PUSH AF ;SAVE THE DROP COUNT PUSH HL ;SAVE THE DROP POINTER LD HL,DMMSG ;OUTPUT "DROPPED MEMORY BLOCK(S)=" TO CONSOLE CALL MSG POP HL ;GET THE DROP POINTER BACK LD E,(HL) INC HL LD D,(HL) INC HL ;WERE NOW POINTING TO THE NEXT DROP LIST SLOT EX DE,HL ;GET THE ADDRESS OF THE CALL MSG LD HL,TMSG5 ;OUTPUT " 05-WRITE SATURATION TEST" TO CONSOLE CALL MSG LD HL,TMSG6 ;OUTPUT " 06-STATIC CHECK CYCLE TEST" TO CONSOLE CALL MSG LD HL,TMSGN ;OUTPUT " ENTER TEST NUMBER(01,02,03,04,05 OR 06)=" CALL MSG CALL CONI ;GET THE ANSWER CP 000H ;HMMMM....DID HE PICK 00 HEX? JP Z,SEL1 ;IF SO,START HIM ALL OVER AGAIN CP 007H ;TEST NUMBER SELECTED >6? JP NC,SEL1 ;IF YES,GIVE THE JERK ANOTHER CHANCE LD B,A ;SAVE THE TEST NUMBER IN B REG. LD HL,EPMSG ;OUTPUT "ENTER PA  -ZERO LD (ERFLG),A CPL PUSH HL ;SAVE ERROR BYTE ADDRESS LD HL,(ECTR) ;UPDATE THE ERROR COUNTER INC HL LD (ECTR),HL LD A,(ERCNT) ;DONE DISPLAYING ALL ERRORS? DEC A JP Z,RFX LD (ERCNT),A LD HL,REMSG ;OUTPUT " RETENTION ERROR AT ADDRESS=" CALL MSG POP HL ;GET THE ERROR BYTE ADDRESS CALL HLOUT PUSH HL ;SAVE ERROR BYTE ADDRESS FOR EXIT CALL MSG LD HL,EXMSG ;OUTPUT "EXPECTED "00" DATA,READ BACK " TO CONSOLE CALL MSG POP HL ;RESTORE POINTER TO BAD BYTE ADDRESS, ; BUT DOR INC HL LD (ECTR),HL LD HL,MRER8 ;OUTPUT "TEST CELL=" TO CONSOLE CALL MSG POP HL PUSH HL EX DE,HL CALL HLOUT EX DE,HL POP HL PUSH HL LD HL,MRER9 ;OUTPUT ", OTHER CELL=" TO CONSOLE CALL MSG POP HL CALL HLOUT PUSH HL LD HL,MER10 ;OUTPUT "PATTERN STORED=" TO CONSOLE CALL MSG POP HL ;BLOW-AWAY H&L REGS. TO ADJUST THE STACK LD A,B CALL BYTEO ;SHOW IT LD HL,MER11 ;OUTPUT "PATTERN READ=" TO CONSOLE CALL MSG LD A,(TPATT) CALL BYTEO ;SHOW IT ALSO CALL CRLF " PATTERN WAS " TO CONSOLE SATX: CALL MSG LD A,(TPATT) ;GET THE TEST PATTERN AND OUTPUT IT TO CONSOLE CALL BYTEO CALL CRLF ;KEEP IT NEAT LD A,0FFH ;SET THE ERROR FLAG LD (ERFLG),A CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT PTX: POP HL ;RESTORE THE "BAD" ADDRESS RET ;CONTINUE TESTING ; ; ; ;SUBROUTINE TO HANDLE ERRORS IN "GALLOPING PATTERN/COLUMN TESTS ; ERR1: PUSH HL LD HL,(ECTR) ;UPDATE THE ERROR COUNTER INC HL LD (ECTR),HL LD A,(ERCNT) ;DONE DISPLAYING ERRORS? DEC A T CELL CALL NZ,ERR1 ;OOPS....REPORT THE ERROR CPL ;BACK TO ORIGINAL STATE......... LD (TPATT),A ;SAVE IT CP B ;STILL EQUAL TO PATTERN? CALL NZ,ERR2 ;OOPS....WRONG HERE ALSO SKIP: INC HL ;BUMP THE OTHER ADDRESS EX DE,HL ;MEMORY TO D&E REGS. LD HL,(MTOP) EX DE,HL CALL COMP ;AT TOP OF MEMORY BLOCK? JP NZ,GPLOP ;IF NOT,CONTINUE "GALLOPING PATTERN" LOOP POP DE ;WHOOPIE...TOP OF MEMORY BLOCK,GET BACK TEST ADDRESS LD A,(DE) ;GET THE TEST CELL CPL ;BACK TO ORIGINAL,AND SAN'T CHANGE THE STACK PUSH HL LD A,(HL) ;GET THE BAD BYTE CALL BYTEO ;SHOW IT CALL CRLF RFX: POP HL ;GET THE ERROR ADDRESS BACK FOR EXIT RET ;EXIT,AND CONTINUE TESTING ; ; ; ;SUBROUTINE TO INDICATE ERROR IN WALKING PATTERN ; PTERR: PUSH HL ;SAVE BAD BYTE ADDRESS LD HL,(ECTR) ;UPDATE THE ERROR COUNTER INC HL LD (ECTR),HL LD A,(ERCNT) ;DONE DISPLAYING ERRORS? DEC A JP Z,PTX LD (ERCNT),A LD HL,MRER1 ;OUTPUT " ERROR AT ADDRESS=" TO CONSOLE CALL MSG POP HL ;GET THE BA;KEEP IT NEAT LD A,0FFH ;SET THE ERROR FLAG LD (ERFLG),A POP AF ;EVERYBODY BACK FROM EXILE POP BC POP DE COMEX: POP HL RET ; ; ; LOOP1: CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT LD DE,10000 LOOP2: DEC DE LD A,D OR E JP NZ,LOOP2 DEC BC LD A,B OR C JP NZ,LOOP1 RET ; ; ; ;ROUTINES FOR MEMORY TEST ; GALPT: LD B,A ;SAVE THE PATTERN CALL BAKPT ;WRITE THE "BACKGROUND" PATTERN GALST: LD HL,(MBOT) ;GET THE TEST CELL ADDRESS EX DE,HL ;SWAP FOR MEMORY TOP INTO H&JP Z,COMEX LD (ERCNT),A LD HL,MRER6 ;OUTPUT "ERROR READING OTHER CELL" TO CONSOLE CALL MSG POP HL JP COMER ;GO TO COMMON ERROR PROCESSING ; ; ; ERR2: PUSH HL LD HL,(ECTR) ;UPDATE THE ERROR COUNTER INC HL LD (ECTR),HL LD A,(ERCNT) ;DONE DISPLAYING ERRORS? DEC A JP Z,COMEX LD (ERCNT),A LD HL,MRER7 ;OUTPUT "ERROR READING TEST CELL" TO CONSOLE CALL MSG POP HL COMER: PUSH HL ;PROTECT THE INNOCENT PUSH DE PUSH BC PUSH AF PUSH HL LD HL,(ECTR) ;UPDATE THE ERROR COUNTEVE IT LD (DE),A INC DE ;BUMP FOR NEXT TEST ADDRESS CALL COMP ;TOP OF BLOCK YET? JP NZ,PNCEL ;IF NOT,GET THE NEXT CELL FOR TEST RET ; ; ; GALCL: LD B,A ;SAVE THE PATTERN CALL BAKPT ;WRITE BACKGROUND LD HL,(MBOT) CNCEL: PUSH HL ;SAVE TEST CELL ADDRESS LD A,(HL) ;GET CONTENTS OF TEST CELL CPL ;FLIP IT LD (HL),A ;CRAM IT BACK CLOOP: CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT LD E,64 ;GOLLY,A DECIMAL NUMBER LD D,000H ;SCRUB D REG. ADD HL,DE EX DE,HL ;NOW D&E REGSD BYTE ADDRESS ,BUT DON'T ;CHANGE THE STACK PUSH HL CALL HLOUT LD HL,MRER2 ;OUTPUT " READ BACK " TO CONSOLE CALL MSG POP HL ;GET THAT ADDRESS AGAIN PUSH HL LD A,(HL) ;GET THE ERROR BYTE CALL BYTEO ;SHOW IT LD HL,MRER3 ;OUTPUT " , EXPECTED " TO CONSOLE CALL MSG LD A,(ERPAT) ;GET THE "GOOD" DATA BYTE CALL BYTEO ;SHOW IT ALSO LD HL,MRER4 ;OUTPUT "LAST ADDRESS WRITTEN WAS" TO CONSOLE CALL MSG LD HL,(LASTW) ;GET THE LAST ADDRESS WRITTEN CALL HLOUT LD HL,MRER5 ;OUTPUT L REGS. PNCEL: PUSH DE ;SAVE TEST CELL ADDRESS LD HL,(MBOT) ;GET ADDRESS OF OTHER CELL LD A,(DE) ;GET CONTENTS OF TEST CELL CPL ;FLIP IT OVER LD (DE),A ;STORE IT BACK GPLOP: CALL KBINT ;CHECK KEY-BOARD INTERRUPT POP DE ;GET BACK ADDRESS OF TEST CELL PUSH DE CALL COMP ;SEE IF TEST ADDRESS EQUALS OTHER ADDRESS JP Z,SKIP ;IF YES,SKIP TESTING LD A,(HL) ;GET THE OTHER CELL LD (TPATT),A ;SAVE IT JUST IN CASE IT'S WRONG CP B ;EQUAL TO PATTERN? LD A,(DE) ;READ BACK THE TES  . EQUAL H&L REGS.+64 LD HL,(MTOP) CALL COMP EX DE,HL JP M,CINCR ;BUMP THE TEST CELL ADDRESS IF < MEMORY TOP ADDRESS JP Z,CINCR POP DE ;GET AND SAVE THE TEST CELL PUSH DE LD A,(DE) CPL ;FLIP IT LD (TPATT),A ;SAVE IT IN CASE IT'S WRONG CP B ;EQUAL TO,PATTERN? CALL NZ,ERR1 ;IF NOT,REPORT ERROR LD A,(HL) ;TEST OTHER CELL LD (TPATT),A ;SAVE IT CP B ;EQUAL TO PATTERN? CALL NZ,ERR2 ;IF NOT,REPORT ERROR JP CLOOP ;TRY NEXT OTHER CELL CINCR: POP HL ;GET TEST CELL ADDRD HL,(MBOT) ;TOP'S IN D&E REGS.,BOTTOM'S IN H&L REGS. BAKGR: CALL COMP ;WE DONE? RET Z LD (HL),A ;STORE THE BACKGROUND PATTERN INC HL ;BUMP FOR NEXT ADDRESS JP BAKGR ;GO DO MORE 'TILL WE HIT TOP ; ; ; ;SUBROUTINE TO INCREMENT H&L REGS. MODULO 64 ; INC64: INC HL ;TEST FOR WRAP-AROUND LD A,L AND 63 RET NZ LD A,L SUB 64 LD L,A RET NC DEC H ;BORROW IF NEEDED RET ; ; ; ;SUBROUTINE TO COMPARE H&L REGS. TO D&E REGS. FOR BLOCK COMPLETION ; COMP: PUSH BC LD B,A LD  BYTE CALL NZ,PTERR ;IF BAD BYTE,REPORT ERROR INC HL ;BUMP THE POINTER JP CPAT1 ;GO FOR MORE WKSET: EX DE,HL ;SET-UP FOR NEXT SECTION,H&L REGS. EQUAL ; LAST ADDRESS IN BLOCK+1 POP DE ;D&E REGS. EQUAL "LAST WRITTEN" ADDRESS EX (SP),HL ;H&L REGS. EQUAL FIRST ADDRESS IN BLOCK PUSH DE ;JAM-ON "LAST WRITTEN" TO STACK CPL ;GET TEST PATTERN BACK CPAT2: CP (HL) ;TEST PATTERN BYTES FROM START OF BLOCK, ; TO "LAST WRITTEN" CALL NZ,PTERR ;ERROR IN "WALKED" BYTE? CALL COMP ;NO,THEN A "PASS" COUNTER ECTR: DEFS 2 ;STORAGE FOR "ERROR" COUNTER ERCNT: DEFS 1 ;STORAGE FOR ERROR DISPLAY COUNTER ; ; ; END ESS LD A,(HL) ;GET CONTENTS CPL ;FLIP BACK TO ORIGINAL LD (HL),A ;RESAVE CALL INC64 ;BUMP TEST ADDRESS MODULO 64 LD A,(HL) ;EQUAL TO PATTERN? LD (TPATT),A ;SAVE IT IN CASE IT'S WRONG CP B CALL NZ,ERR1 CALL INC64 LD A,(HL) LD (TPATT),A CP B CALL NZ,ERR1 CALL INC64 AND 63 RET Z ;RETURN IF WRAPPED AROUND TO START ADDRESS JP CNCEL ; ; ; WALKT: CALL BAKPT ;WRITE FULL BACKGROUND PATTERN LD HL,(MBOT) ;POINT TO FIRST BYTE OF BLOCK ADDRESS PUSH HL ;SAVE FOR INSTANA,H SUB D JP NZ,COMP1 LD A,L SUB E COMP1: LD A,B POP BC RET ; ; ; ;STORAGE FOR VARIABLES AND STACK POINTERS ; DEFS 16 ;16 BYTE STACK POINTER STORAGE AREA STACK: DEFS 000H ERPAT: DEFS 1 ;STORAGE FOR ERROR PATTERN ERFLG: DEFS 1 ;STORAGE FOR BLOCK ERROR FLAG DROPC: DEFS 1 ;STORAGE FOR NUMBER OF "DROPPED" BLOCKS DROP: DEFS 28 ;DROP BUFFER DROPP: DEFS 2 ;POINTER TO NEXT FREE SLOT IN DROP LIST MBUF: DEFS 15 ;MEMORY BLOCK BUFFER DEFB 080H ;TERMINATOR FOR MEMORY BLOCK BUFFER PORE WE DONE? INC HL JP NZ,CPAT2 ;GO FOR MORE IF NOT DONE YET POP HL ;SET-UP FOR NEXT PATTERN BYTE,H&L REGS. EQUAL ; "LAST WRITTEN" ADDRESS POP DE ;D&E REGS. EQUAL LAST ADDRESS IN BLOCK+1 INC HL ;BUMP FOR NEXT ADDRESS TO WRITE CALL COMP ;DONE THE WHOLE THING? RET Z PUSH HL ;NO,PUT A COPY OF MEMORY BOTTOM ON THE STACK LD HL,(MBOT) EX (SP),HL JP WPAT ;GO DO SOME MORE ; ; ; ;SUBROUTINE TO GENERATE BACKGROUND PATTERN AS CONTAINED IN A REG. ; BAKPT: LD HL,(MTOP) EX DE,HL LT RESET CPL ;FLIP BACKGROUND PATTERN FOR TEST PATTERN LD (TPATT),A ;SAVE IT WPAT: CALL KBINT ;CHECK FOR KEY-BOARD INTERRUPT LD A,(TPATT) ;GET THE TEST PATTERN LD (HL),A ;STUFF PATTERN INTO MEMORY PUSH HL ;SAVE "LAST WRITTEN" ADDRESS LD (LASTW),HL INC HL CPL ;FLIP TO BACKGROUND PATTERN CPAT1: CALL COMP ;TEST BACKGROUND PATTERN FROM "LAST WRITTEN+1", ; TO "END OF BLOCK" ;TESTED ALL REMAINING BACKGROUND? JP Z,WKSET ;IF YES,GO TEST PATTERN BYTES CP (HL) ;NO...TEST BACKGROUNDINTER MEMPT: DEFS 2 ;STORAGE FOR MEMORY BUFFER POINTER BLKST: DEFS 2 ;STORAGE FOR MEMORY BLOCK START ADDRESS MEND: DEFS 2 ;STORAGE FOR MEMORY BLOCK END ADDRESS MBOT: DEFS 2 ;STORAGE FOR 256 "CHUNK" START ADDRESS MTOP: DEFS 2 ;STORAGE FOR 256 "CHUNK" END ADDRESS TPATT: DEFS 1 ;STORAGE FOR LAST PATTERN WRITTEN LASTW: DEFS 2 ;STORAGE FOR LAST ADDRESS WRITTEN MTEST: DEFS 2 ;STORAGE FOR MEMORY TEST POINTER AUTOR: DEFS 2 ;STORAGE FOR "AUTO1" RETURN ADDRESS FOR LOOPING PCTR: DEFS 2 ;STORAGE FOR  ;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 V 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 ; jy ; ;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 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 aIA 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 Dust 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  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 randomnd 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 ; ;************************ELTA 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 onlexample, 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  ******************** ; 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 EALL 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: SG 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 TUCK 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 AQU 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 ; ;**************************************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 ?;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 C,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 ****** ; 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 PM 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 S   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 BYTEMOV 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 TESTCALL 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: ;COMPLEMEN 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 ! P 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 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 !T 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: USH 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  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  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    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 CPF 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 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  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 UI 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 P 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 serieNUMBERS 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 ENDISERS 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 ! NIBB: 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 !s 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  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 CLisplay further errors. LOCATION SHOULD BE WAS 7000 00 0000 0000 FF 1111 1111 7001 00 0000 0000 FF 1111 1111 7002 00 0000 0000 FF 1111 1111 7003 00 0000 0000 FF 1111 1111 7004 00 0000 0000 FF 1111 1111 7005 00 0000 0000 FF 1111 1111 7006 00 0000 0000 FF 1111 1111 7007 00 0000 0000 FF 1111 1111 7008 00 0000 0000 FF 1111 1111 7009 00 0000 0000 FF 1111 11 This will invoke the program with no special options. MEMRS -R This will invoke the program for the random number test only. MEMRS -B This will invoke the program for default testing to the bottom of the BDOS and use the BDOS for I/O rather than default test to the bottom of the BIOS and use the BIOS for I/O. MEMRS -BR or MEMRS -RB or MEMRS -B -R or MEMRS -R -B This will invoke the piven or an error message will be displayed and the prompt issued again. The program may be aborted at any time by hitting any of the keys specified in the abort prompt. The program prompts as follows:- MEMRS Memory Test - Version 1.9 BDOS located at D300 Top of memory at FFFF Press "SP" or "^C" to warm boot at any time or "^X" to restart test from beginning. Response of "CR" gives default test range which starts above this program and ends at BDOS Starting addressOOP ;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 11 700A 00 0000 0000 FF 1111 1111 700B 00 0000 0000 FF 1111 1111 700C 00 0000 0000 FF 1111 1111 700D 00 0000 0000 FF 1111 1111 700E 00 0000 0000 FF 1111 1111 700F 00 0000 0000 FF 1111 1111 7010 00 0000 0000 FF 1111 1111 7011 00 0000 0000 FF 1111 1111 "CR" to continue test - "SP", "^C" to quit, "^X" to restart. Internal Prompts ---------------- The program prompts for trogram for default testing to the bottom of the BDOS as above AND random number only test. Error Messages -------------- If any memory location fails any of the component parts of the memory test an error message will be displayed as follows:- LOCATION SHOULD BE WAS 6000 00 0000 0000 FF 1111 1111 If there are multiple bad memory locations up to 18 will be displayed before the display halts and prompts for a keypress to d (Hex or "CR") 08F7 Ending address (Hex or "CR") D3F9 "CR" to continue test - "SP", "^C" to quit, "^X" to restart. Tutorial on Memory Testing -------------------------- There is no practical way to do a thorough test on all of a computers memory in one pass. The memory test program itself will occupy some memory which it cannot thoroughly test. It is possible to write simple memory tests which are able to test the memory that the reside in but these tests will no DOCUMENTATION FOR MEMRS.COM Introduction ------------ MEMRS is an exhaustive memory test program for CP/M environments. It tests from the top of itself to the bottom of the CP/M BIOS or alternatively, the BDOS. Usage ----- MEMRS [-R][-B] Where [-R] is an optional "Random number only" test specifier [-B] is an optional "Test to BDOS" specifier Examples -------- MEMRS he starting and ending addresses of the block of memory to be tested and offers default values which will test the largest possible block of memory. The default top of the block to be tested depends on whether the -B option was specified. If the default values are chosen, the actual value determined by the program is displayed next to the prompt as if the user had entered the value. When specific values are entered by the user a valid 4 digit hexadecimal address must be g!  t detect many types of memory errors. Memory faults can be fairly simple gross errors where a bit is permanently stuck (high or low) or they may be timing/pattern sensitive where the fault is only evident with a certain combination of data in surrounding bits. To attempt to test memory as thoroughly as possible several different types of tests need to be performed. MEMRS has a wide variety of tests and has proven particularly effective in locating bad memorm goes directly to the BIOS jump table so it is not possible to log the output on the printer using Control P. Specifying the BDOS option at invokation directs all console output via the BDOS which means that it is possible to log the test output on the printer by typing Control P before the program is invoked. END OF MEMRS.DOC t is highly unlikely that you will be able to reliably load any programs at all from disk so there is not a great deal of point in designing memory tests for these addresses. If an error is suspected in the CP/M BIOS memory area the best move is to build a smaller size CP/M system that does not use the suspected bad memory and the load MEMRS and test the suspect memory. MEMRS will test any address explicitly given to it. It does not test to see if you will kill CP/M or@ ++ Now searching for "-CATALOG" file++ !  ) .) ! ”>.”#””͡”››tK››͸›* =: =͔="  ʳ ª~#.  ¿~  #~  .+~#0:0~#!A.O.Gy~#0M0 K MMɷ:m2 FSÄCRCKLIST$$$››tK›, › **}|!"*{z*~]*"Ü  DISK FULL: CRCFILE$!"*~y in comparison to large number of other memory test programs with which it has been compared. It does not perform any long term memory retention testing or any "burn in" testing, however these types of tests are best performed over long periods of time and require highly optimised programs to execute in realistic time spans. MEMRS is intended as a relatively fast but thorough test to quickly establish whether any of the more common memory errors has occured. I#CRC.COM 5.0 6/18/82CRCKFILE???!9" 1 M @ CRC Ver 5.0 CTL-S pauses, CTL-C aborts :] O@ ++Searching for CRCKLIST file++@ Now searching for "CRCKFILE" file++ !  1 .) F!  ͡]͸! ͔0CRCKLIST???CRCKFILE???!9" M à*,*.}|ډ!".*,{z{** u*.".G*.",!".***,}>*.#".ɯ22)! ",". <  NO FILECRC FILE$!   >. @ Checking wi itself. The random number only test is useful for longer term testing of memory. If an intermittent fault is suspected and the memory has passed several "full" test cycles it is probably worthwhile stopping the test and restarting it as a random number only test which will cycle much faster. The normal default ending address of the bottom of the BIOS gives the largest possible block of memory to test. It also means that all console input and output from the progra*#"ɯ2i2}! "!"]]2 s : ~# ++FILE NOT FOUND++$: F*}’">͇†]<  CANNOT CLOSE CRCFILE$CRCKLISTCRCSK FULL: CRCFILE$  w# !]͐ DONE$!e S!]Q !eZ @ --> FILE: XXXXXXXX.XXX CRC = oS) \<‘@ ++OPEN FAILED++ !" !" * | ʹ) \!~2 #" Ý: ) > T : ) @ ++FILE READ En practical terms, the whole of a computer's memory rarely fails simultaneously. Memory failures generally occur in individual memory chips which usually cover no more than 16K of memory space (though this will change as 64K chips become readily available). In this case it is usually possible in CP/M systems to readdress memory so that the suspected bad memory is located in an area that can be tested with MEMRS. If the bad memory is located in any of the CP/M system areas ith file - ! ~T #M M 2 2 2 2 ! >2 3o: : @ ***No CRC Files found***$> ʉ ʉw#: <2 P6: .6@ Can not parse string ! ~ʽT #ñM ! > 6 #6^#6! ~T #! 4M #x] #e w~ T #>2 @ - s M@ File not found ! 4 >2 o: G: „: G: „@ *Match* 2 ! 4@ <-- is, was --> : ) > T : ) M 2 ! 4<2 ~# @ Not a space between CRC values<2 G-CATALOG???"  RROR++ <* |): o% |g}o" 2  ; 0T ~T #~A > T > _h : F{͇2h2|: ʲ !\   :\2 ! \  \ ! \  \! \  \<7=Ɓo&   ]  2h2|2   ~$#~# x  : F} *}= ">͇1 ] $ G  > $  !:G (08:0)))_ > $?$  !:G (08:8 g0a8 ))))o} > $  ?$( _'d' 'y0w#!R!>0= } > $  ?$( _LGN.MAC CRC = E8 20 --> FILE: MDIAGLPT.COM CRC = 4C A0 --> FILE: MDIAGTTY.COM CRC = 62 83 --> FILE: LOWTTY .COM CRC = 5E CA --> FILE: LOWLPT .COM CRC = 47 A6 --> FILE: 18-DISK .DOC CRC = FF ABig equ 3 ;(should be set larger ; for devices having ; track or sector ; numbers >99 ) ;program identification $ver equ 1 ;version $rev equ 0 ;revision jp dtst ;enter from CP/M drv: db 0 ;drive to test trk: dw 0 ;current track trkf: dw 0 ;first track to test digits: db $dig dtst: ;entry from CP/M ld de,dtsta ;print program title ld c,9 call cpm dtst01: ld c,12 ;check CP/M version call cpm ld a,l ;make sure 2.x and 0f0h cp 20h jr z,dtst match - : ̓ : J M @ Quantity of lines failed parse test - : ̓ : ~ M @ Quantity of file(s) not found - : ̓ * d͔  ͔ 0T  Җ Wyʩ 0T 0ztiil;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;:::: KAYPRO DISK ALIGNMENT PROGRAM :::: ;:::: Micro Cornucopia Magazine/ P.O. Box 223/ Bend OR 97709 :::: ;:::: :::: ;:::: Derived from Z80 disk diagnostics/MicroCosm Labs 1980 :::: ;:::: :::: ;:::: Version 1.0 -----> Dana Cotant 1/3/84 ::::    } (  X4a802A2t n(K"*"ͫ͟ʹwi4cʑe  ; nQ :O*K$ Z80 Disk Alignment Program Version 1.0 Strike any key to abort test in progress And return to this selection screen $ Select different drive ? $ Drive to be tested (A-B) $ Confirm: test drive X ? $ Track to Seek ? :: Decimal input please -> $ Continue or exit test? (C/E)$ Goodbye. $ Need CP/M 2.x to ex02 ld de,dtstz ;not CP/M 2.x, print ld c,9 ;error message and exit call cpm jp wboot dtst02: xor a dtst12: ld de,dtsth ;select drive to be call getl ;used for test sub 'a' ;convert to logical # cp $drvf ;make sure its legal call c,query jr c,dtst12 ;too small,try again cp $drvl+1 call nc,query jr nc,dtst12 ;too large,try again ld (drv),a ;save drive assignment add a,'A' ;also format for output ld (dtsti1),a ld de,dtsti ;confirm selected drive? call getyn cp 'n' --> FILE: DISKTEST.MAC CRC = ED 33 --> FILE: 4DISKTST.COM CRC = 49 44 --> FILE: 2DISKTST.COM CRC = 20 C6 --> FILE: MDIAGLPT.MAC CRC = D0 25 --> FILE: DISKTEST.DOC CRC = 46 B3 --> FILE: 10DSKTST.COM CRC = F2 A3 --> FILE: MDIAGXXX.DOC CRC = 40 A0 --> FILE: MEMRS .COM CRC = 32 4F --> FILE: MDIAGTTY.MAC CRC = 63 68 --> FILE: MEMRS .ASM CRC = 17 F5 --> FILE: MEMRS .DOC CRC = 5F 5D --> FILE: CRC .COM CRC = B2 07 --> FILE: DISKALGN.COM CRC = E5 15 --> FILE: DISKA;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: aseg .z80 org 100h cpm equ 5 ;references to wboot equ 0 ;operating system ;references to ASCII char cr equ 0dh lf equ 0ah ff equ 0ch tab equ 09h ; parameters for disk $drvf equ 0 ;first drive to allow ;testing (0=A,1=B,etc) $drvl equ 1 ;last drive to allow ;testing $trkf equ 0 ;first track $trkl equ 39 ;last track ;number of digits to ;accept in track and ;sector assignments $d#   jr z,dtst12 ;not confirmed,try again dtst17: ld de,dtstk ;enter track call getn ;to test ld (trkf),hl ;save it dtst40: ld hl,(trkf) ld (trk),hl ;initialize current track call seldsk call settrk call read dtst42: ld c,6 ;check for interruption ld e,0ffh call cpm ;from console or a jp nz,dtst94 ;break detected,quit jp dtst42 dtst94: ;done with all passes ld de,dtstw ;ask whether to exit call getl ;or to continue test cp 'c' ;c=continue jp z,doagn ld de,getla ;tab and print ld c,9 ;cue mark call cpm call getchar ;read console or 20h ;fold to lower case ret getla: db tab,'> $' ; ; getn: ;get a decimal number ;from the console. ; ;call de=address of cue ;return hl=number push de ;save cue message address ;in case needed later ld c,9 call cpm ;print cue message ld de,getna ;print tab and cue mark ld c,9 call cpm ld hl,0 ;initialize forming ;answer ld a,(digits) ld b,a ;total ch,lf,'Track to Seek ? ' db ' :: Decimal input please -> $' dtstw: db cr,lf,'Continue or exit test? (C/E)$' dtstx: db cr,lf,lf,'Goodbye.',cr,lf,'$' dtstz: db cr,lf,'Need CP/M 2.x to execute.',cr,lf,'$' ; utility and console input routines getyn: ;get y or n response ;from operator. ; ;call de=address of cue ;return acc=y or n push de ;save cue address ld c,9 ;print cue message call cpm ld de,getyna ld c,9 ;print possible answers call cpm call getc of entered number, ; hl=entire 16 bit no. ; push de ;save cue address ;in case needed again ld c,9 call cpm ;print cue message ld de,getha ;print tab and cue mark ld c,9 call cpm ld hl,0 ;initialize forming ;answer ld a,(digits) ld b,a ;max digits to accept geth1: push bc ;save registers push hl call getchar ;read console pop hl pop bc ;restore registers cp cr ;if carriage return exit jr z,geth25 cp '0' ;make sure its legal jr c,geth3 ; cp 'e' ;e=exit jr nz,dtst94 ;if no match,try again ld de,dtstx ;print goodbye ld c,9 call cpm ;and return control jp wboot ;to CP/M doagn: ld de,dtstn call getyn cp 'n' jp z,dtst17 jp dtst ; disk interface to CP/M BIOS seldsk: ld a,(drv) ;select disk drive ld c,a ld de,24 ;this routine links ;to the desired routine ;through the standard ;CP/M BIOS jump table jpbios: ld hl,(wboot+1) add hl,de jp (hl) settrk: ld bc,(trk) ;select track laracters allowed ;to be input getn1: push hl ;save answer push bc ;save char. count call getchar ;read console pop bc ;restore char. count pop hl ;restore forming answer cp cr ;is this return? jr z,getn9 ;yes,exit with answer cp '0' ;is this legal char.? jr c,getn3 ;no, jump cp '9'+1 ;is this legal char.? jr nc,getn3 ;no,jump and 0fh ;isolate bottom 4 bits ;previous data * 10 push hl pop de add hl,hl ;(*2) add hl,hl ;(*4) add hl,de ;(*5) add hl,hl har ;get a character ;from console or 20h ;fold to lower case pop de ;restore cue address ;in case needed again cp 'y' ;make sure response ;is ok ret z ;exit if y cp 'n' ret z ;exit if n push de call query ;print question mark if pop de ;not y or n, try again jr getyn ; getyna: db '(Y/N) ',tab,'> $' ; ; getl: ;get any letter response ;from operator. ; ;call de=address of cue ;return acc=ASCII char. ld c,9 ;print cue message call cpmno,jump cp '9'+1 ;if alpha fold to jr c,geth15 ;lower case or 20h geth15: cp 'f'+1 ;make sure its legal jr nc,geth3 ;no,jump cp 'a' ;check if alpha jr c,geth2 ;jump if 0-9 add a,9 ;add correction geth2: and 0fh add hl,hl ;previous data *16 add hl,hl ;(left shift 4 bits) add hl,hl add hl,hl add a,l ;add this char. to ld l,a ;forming result djnz geth1 ;keep reading console geth25: pop de ;clean up stack ld a,l ;put lower 8 bits ;of answer in acc. ;(in casd de,27 jr jpbios read: ;read one disk sector ld de,36 jr jpbios dtsta: db cr,lf,lf db 'Z80 Disk Alignment Program Version ' db $ver+'0','.' db $rev+'0',cr,lf,lf,lf db ' Strike any key to abort test in progress ',cr,lf db ' And return to this selection screen ',cr,lf,lf db '$' dtstn: db cr,lf,lf,'Select different drive ? $' dtsth: db cr,lf,'Drive to be tested (',$drvf+'A','-' db $drvl+'A',') $' dtsti: db cr,lf,'Confirm: test drive ' dtsti1: db 'X ? $' dtstk: db cr;(*10) ld e,a ;now add in this digit ld d,0 add hl,de djnz getn1 ;count characters accepted jr getn9 ;enough accepted,exit getn3: ;illegal character detected. call query ;print question mark and pop de ;restart input jr getn getn9: ;input complete,clean ;stack and exit with ;answer in (hl) pop de ret getna: db tab,'> $' getnb: db '?$' ; ; geth: ;get $dig hex digits ;from keyboard ; ;call de=addr of cue ;return acc=lower 8 bits ; $  e exit by ; carriage return) ret geth3: call query ;print question mark pop de ;then restart input jr geth getha: db tab,'> $' ; ; query: push af ;save flags ld c,9 ;print question mark ld de,querya call cpm pop af ;restore flags ret querya: db ' ?$' ; ; getchar: ;get 1 character from ;console via raw input ;mode. do not echo a ;carriage return. ld e,0ffh ld c,6 call cpm ;read console or a ;anything there? jr z,getchar ;no,try again cp cr C" VERSION 1.01 (C) 1979 EMORY ADDRESS= O ADDRESS= TOP OF MEMORY= , MEMORY QUALIFICATION TEST IS IN PROGRESS ( TEST MEMORY IN "AUTO" MODE (Y OR N)? 0 TEST "ALL","SELECT",OR "MONITOR" (A,S OR M)?  TEST IS IN PROGRESS TESTING MEMORY ,FROM  TO  PASS=, TOTAL ERRORS= GALLOPING PATTERNS TEST  STATIC CHECK CYCLE TEST  CHECKING DATA RETENTION  GALLOPING COLUMNS TEST  RANDOM PATTERNS TEST  WRITE SATURATION TEST  WALKING PATTERNS TEST  NO MEMORY BLOCKS DROPPED  DROPPED or a rr h rr l ex de,hl pop hl ret end !͊U!͊:2!; >  !͊*0"4$."6> *2f G !9͊ !U͊*2*0 #ڀ !q͊*0"4*2"6>&&!͊*0"4$."6>̀̀*2 ï ʹ *=*6DM *4 !͊*2DM *0T]!33!9yx" ;;}o|g>o|o kb>3 =# B >> ==# ~+~w#~w#yxz +~+## #yxz ++~## B kb! kbUr#s#yx‹ !9zS_ #yxš !9U~ʋ Uʋ <ʋ *;  c >2:C=t 2C! W !9B ;is it a carriage return? ret z ;yes push af ;no,echo it ld e,a ld c,6 call cpm pop af ;restore acc. and exit ret ; ; conv: ;convert binary to ;decimal ascii ; ;call bc=binary data, in ; range 0000-9999. ; hl=first byte addr ; to store output ; ld de,1000 call div call conv9 ;thousands digit ld de,100 call div call conv9 ;hundreds digit ld de,10 call div call conv9 ;tens digit call conv9 ;units ret ;back to ca MEMORY BLOCK(S)=  LOW MEMORY ADDRESS=  HIGH MEMORY ADDRESS=  INVALID MEMORY ADDRESS  TEST OPTIONS ARE:  01-GALLOPING PATTERNS TEST 02-GALLOPING COLUMNS TEST 03-WALKING PATTERNS TEST 04-RANDOM PATTERNS TEST 05-WRITE SATURATION TEST 06-STATIC CHECK CYCLE TEST - ENTER TEST NUMBER (01,02,03,04,05 OR 06)=  ENTER PATTERN(00-FF)=  RETENTION ERROR AT ADDRESS= ! EXPECTED "00" DATA,READ BACK  ERROR AT ADDRESS= READ BACK ,EXPECTED LAST ADDRESS WRITTEN WAS  ,PATTERN WA1p0 )) 00OY6 Y Y2BYy!+|y!͊!5͊!#|ʛ~/wʎ+U!H͊!"4!"6!"; 1Ú1B-YMpGTʚB?Y6OY!*͊B! ))))oBOYFOY O0B|2}2R=Y~2 Y!͊^  ʠ^ʤwʠ YEY#y+y  Y Y Y Y YI MICROCOSM ASSOCIATES "SUPER MEMORY DIAGNOSTI!  S!  PR! !  e!& !9ZV!2  v!; !9{_{_n _ Q >,c_ z/czF *A#"A*; z ڔ 0cʛ z ڬ 0c: !͊!!͊^#V#U= >2C! ";!͊A S M !"4!"6M !͊|* !D͊ "4!+͊z*4H !D͊ #"6!_͊!u͊!͊!͊!͊!͊!͊!͊SM M G!K͊SO!͊ x_! y &À ä /2/*A#"A:C= 2C!e͊U͊!͊~2B*A#"A:ller conv9: ld a,c ;turn quotient into add a,'0' ;ASCII character ld (hl),a ;and store it inc hl ;bump output pointer push de ;bc <- remainder pop bc ret ; ; div: ;single precision divide ;call bc=numerator ; de=divisor ;return bc=quotient ; de=remainder push hl ld hl,0 or a sbc hl,de ex de,hl ld hl,0 ld a,17 div0: push hl add hl,de jr nc,div1 ex (sp),hl div1: pop hl push af rl c rl b rl l rl h pop af dec a jr nz,div0S ERROR READING OTHER CELL ERROR READING TEST CELL TEST CELL= , OTHER CELL= PATTERN STORED= PATTERN READ=BIT(S) IN ERROR= F#NY#Ž!"?"A{> >!u͊YN õͨ!"+w+w!".:**0s#r#"!4*.+6> 2C2*.~#"..g"0g"2!"=!͊!͊*0U!͊*2U!͊*?#"?U! ͊*AU!p"; 1!͊*0"4*2"6d>d>> d/:8d/*6*4G28~#ͨ2>2*A#"A:C=O 2C%  C=O 2C!͊U!͊~2!͊:2!͊*9U!͊:82B>2ͨ*A#"A:C= 2C!͊Æ *A#"A:C= 2C!͊*A#"A!7͊U!D͊U!R͊x2!e͊:82B>2ͨ'z x G*4*4/ͨ~28Q /28m #*6 / G*4~/wͨ@*6]]/28Q ~28m 1~/w~28Q ~28Q ?-*4/28ͨ:8w"9#/ʦ #Ø/ #«#*4Ë*6*4w##}?}@o%G|}xCELL TEST CELL= , OTHER CELL= PATTERN STORED= PATTERN READ= BIT(S) IN ERROR=F#NY#[!""{> u>!eWYʘNʛ Â͜!"+w+w!":**s#r#"!4*+6> 22*~#".g"g"!"!W!W*I!W*I!W*#"I!W*I!="î 1!W*"*"dͥ>͍̓d>͍ͥ̓ dͥ/͍̓:dͥ/͍̓**G2͟~Ĵ#Ø̓͜¥2>2*#":= 2!vWI!W:&! >̓ ͎ ͍̓.01 (C) 1979EMORY ADDRESS= O ADDRESS= TOP OF MEMORY=+ MEMORY QUALIFICATION TEST IS IN PROGRESS' TEST MEMORY IN "AUTO" MODE (Y OR N)?/ TEST "ALL","SELECT",OR "MONITOR" (A,S OR M)? TEST IS IN PROGRESS TESTING MEMORY,FROM  TO  PASS=, TOTAL ERRORS= GALLOPING PATTERNS TEST STATIC CHECK CYCLE TEST CHECKING DATA RETENTION GALLOPING COLUMNS TEST RANDOM PATTERNS TEST WRITE SATURATION TEST WALKING PATTERNS TEST NO MEMORY BLOCKS DROPPED DROPPED MEMORY BLOCK(S)= LOW MEMORY ADD&B>2͜*#":=ʌ 2!WD *#":=ʌ 2!W*#"!WI!WI!Wx&!2W:&B>2͜'z” xŽ G̓**/͜͟ ~2 /2+ #*͟° /͟© G̓*~/w͜@*͟/2 ~2+ ~/w͓~2 ͓~2 ͓? ̓*/2͜:w"#/͟dĵ #V/ĵ ͟#i#͟*I**͟w#Ê#}?}@o%G|¨}x*6*4w##}?}@o%G|}x ͎ ͍!W*"$.">͡ ͡ *͟3  !"W͎ !<W** #͟M !VW*"*"> !W*"$.">>>*͟ʛ | r **DM *ÿ !oW*DM *T]!33!9yx ;;}o|g>o|o kb> =#ª  >>ª ==#ª ~+~w#~w#yxG +~+##ª #yxG ++~##ª  kb! kbUr#s#yxX !9zS_ª #yxg !9U~X UX 2:=8 2! WvÖ !9B! C S! C P! Ö ! C 2! Ö !9ZV! C C!RESS= HIGH MEMORY ADDRESS= INVALID MEMORY ADDRESS TEST OPTIONS ARE: 01-GALLOPING PATTERNS TEST 02-GALLOPING COLUMNS TEST 03-WALKING PATTERNS TEST 04-RANDOM PATTERNS TEST 05-WRITE SATURATION TEST 06-STATIC CHECK CYCLE TEST, ENTER TEST NUMBER (01,02,03,04,05 OR 06)= ENTER PATTERN(00-FF)= RETENTION ERROR AT ADDRESS= EXPECTED "00" DATA,READ BACK  ERROR AT ADDRESS= READ BACK ,EXPECTED  LAST ADDRESS WRITTEN WAS  ,PATTERN WAS  ERROR READING OTHER CELL ERROR READING TEST **͟w#Ê#}?}@o%G|¨}x1d0 )) 00OY6 Y Y&B Yy!+|m!W!'W!#|ʏ~/wʂ+I!9W!"!"!"â 1g1B-YMdGTgB?Yô6OY!WB! ))))o6OY:OY C0B|&}&F=Y~& Y! WR ʴ ʔ^ʘwʔ YEY#m+m ʴ Y Y Y Y YG MICROCOSM ASSOCIATES "SUPER MEMORY DIAGNOSTIC" VERSION 1 Ö !9{_{_2 &  >,& z/z *#"*C z X 0\ z m 0:€ !W!!W^#V#I=ƒ >2! "!WA S Mʴæ !"!" !W| !W "!Wz* !WÛ #"!5W!JW!iW!W!W!W!W!WS  G!WSO!W x_!l yá >â q/2/*#":=ʳ 2!8WIW!VW~&B*#":= 2!vWI!W~&!W:&!W*I!W:&  P! P1]dP0P )P)P 0P0OYP6P YP YP QBPQYPy!+|gP!QQV!!RQV!_#|ʉP~/w|P+CQ!3RQV!"]!@"]!P"]ÜX1]aV1]BP-YPPM^QGPTaVBP?YPîP6POYP!RQVPBP!P ))))PPPoPPPPPPP0QOYP4QOYP =Q0BP| Q} Q@Q=YP~ Q YP!RQVPLQP ʮP ʎQ^ʒQ QwʎQ YPEYP#gQ+gQ ʮP YP YP YP YP YPG MICROCOSM ASSOCIATES "SUPER MEMORY DIAGNOSTIC" Y=Z=V!YÐY!9{_{_,Z ZZ>, Zz/z Z*]#"]*]=Zz RZ0VZz gZ0:]zZ!SQV!]!SQV^#V#CQ=}Z>2]!Z"]!RQVPAʻZSZMʮPàZ!"]!@"]Z!SQVP"]!SQVPzPZ!TQVÕZ#"]!/TQV!DTQV!cTQV!TQV!TQV!TQV!TQV!TQVSPZZG!UQVSPO!RQVZx_!U[yÊ\\']ÜXkWW/2]/*]#"]:]=ʜ[2]!2UQVCQQV!PUQV~ QBP*]#"]:]=[2]!pUQVCQ!UQV~ Q!UQV:] Q!UQV*]CQ!UQV:] QBP>2ING TEST CELL TEST CELL= , OTHER CELL= PATTERN STORED= PATTERN READ= BIT(S) IN ERROR=F#NYP#UV!"]"]]{>oV>!_RQVPYʒVNʕZ|V͖Q!]"]+w+w!]"]:]V*]*]s#r#"]!]4*]+6> 2]2]*]~(#"]V.g"]g"]!V"]!RQV!RQV*]CQ!RQV*]CQ!RQV*]#"]CQ!RQV*]CQ!7W"]èX1]!SQV*]"]*]"]d͟W>l]͇Wd>͟Wl]͇WXd͟W/l]͇W:]d͟W/l]͇W*]*]G2]͈]~ĮW#ÒW͖Ql]ŸW2]>2]*]#"]:]=[2]!pUQVCQ!UQV:] Q!U[>l] w\P! P1]pP0P )P)P 0P0OYP6P YP YP2QBPQYPy!+|yP!Q͌V!7R͌V!_#|ʛP~/wʎP+UQ!JR͌V!"+^!@"-^!P"2^X1]ÜV1]BP-YPPMpQGPTʜVBP?YPP6POYP!,R͌VPBP!P ))))PPPoQPPPPPPBQOYPFQOYP OQ0BP|2Q}2QRQ=YP~2Q YP!R͌VP^QP P ʠQ^ʤQQwʠQ YPEYP#yQ+yQ P YP YP YP YP YPL MICROCOSM MEMORY TEST For LowVERSION 1.01 (C) 1979EMORY ADDRESS= O ADDRESS= TOP OF MEMORY=+ MEMORY QUALIFICATION TEST IS IN PROGRESS' TEST MEMORY IN "AUTO" MODE (Y OR N)?/ TEST "ALL","SELECT",OR "MONITOR" (A,S OR M)? TEST IS IN PROGRESS TESTING MEMORY,FROM  TO  PASS=, TOTAL ERRORS= GALLOPING PATTERNS TEST STATIC CHECK CYCLE TEST CHECKING DATA RETENTION GALLOPING COLUMNS TEST RANDOM PATTERNS TEST WRITE SATURATION TEST WALKING PATTERNS TEST NO MEMORY BLOCKS DROPPED DROPPED MEMORY BLOCK(S)= LOW M]͖Q*]#"]:]=u\2]!UQV-\*]#"]:]=u\2]!UQV*]#"]!UQVCQ! VQVCQ!VQVx Q!,VQV:] QBP>2]͖Q'z}\ xw\Gl]*]*]/͖Q͈]ʵ\~2][/2]\#*]͈]™\/͈]’\Gl]*]~/w͖Q@*]͈]]]/2][~2]\\~/w|]~2][|]~2][|]?\l]*]/2]͖Q:]w"]#/͈]M]Ğ[#?]/Ğ[͈]#R]#͈]*]2]*]*]͈]w#s]#}?}@o%G|‘]}x]*]*͇Wl] w\͇W!SQV*]"]$."]>͊\͊\*]͈]-XX!SQVw\!6SQV*]*]h[#͈]GX!PSQV*]"]*]"]>\\!SQV*]"]$."]>']']*]͈]ʕXvXlZ*]*]DM *]ùX!iSQV*]DM *]T]!33!9yxX;;}o|g>o|oÿXkb>X=#¤Y Y>>¤Y==#¤Y~+~w#~w#yxAY+~+##¤Y#yxAY++~##¤Y Ykb!ʿXkbUr#s#yxRY!9zS_¤Y#yxaY!9U~RYURY2]:]=2Z2]!YWpUÐY!9B!Y=ZS!Y=ZPV!YÐY!Y=Z,V!YÐY!9ZV! Memory By Dana Cotant :: Micro Cornucopia EMORY ADDRESS= O ADDRESS= TOP OF MEMORY= , MEMORY QUALIFICATION TEST IS IN PROGRESS ( TEST MEMORY IN "AUTO" MODE (Y OR N)? 0 TEST "ALL","SELECT",OR "MONITOR" (A,S OR M)?  TEST IS IN PROGRESS TESTING MEMORY ,FROM  TO  PASS=, TOTAL ERRORS= GALLOPING PATTERNS TEST  STATIC CHECK CYCLE TEST  CHECKING DATA RETENTION  GALLOPING COLUMNS TEST  RANDOM PATTERNS TEST  WRITE SATURATION TEST  WALKING PATTERNS TEST  NO MEMORY BLOCKS DREMORY ADDRESS= HIGH MEMORY ADDRESS= INVALID MEMORY ADDRESS TEST OPTIONS ARE: 01-GALLOPING PATTERNS TEST 02-GALLOPING COLUMNS TEST 03-WALKING PATTERNS TEST 04-RANDOM PATTERNS TEST 05-WRITE SATURATION TEST 06-STATIC CHECK CYCLE TEST, ENTER TEST NUMBER (01,02,03,04,05 OR 06)= ENTER PATTERN(00-FF)= RETENTION ERROR AT ADDRESS= EXPECTED "00" DATA,READ BACK  ERROR AT ADDRESS= READ BACK ,EXPECTED  LAST ADDRESS WRITTEN WAS  ,PATTERN WAS  ERROR READING OTHER CELL ERROR READ'  OPPED  DROPPED MEMORY BLOCK(S)=  LOW MEMORY ADDRESS=  HIGH MEMORY ADDRESS=  INVALID MEMORY ADDRESS  TEST OPTIONS ARE:  01-GALLOPING PATTERNS TEST 02-GALLOPING COLUMNS TEST 03-WALKING PATTERNS TEST 04-RANDOM PATTERNS TEST 05-WRITE SATURATION TEST 06-STATIC CHECK CYCLE TEST - ENTER TEST NUMBER (01,02,03,04,05 OR 06)=  ENTER PATTERN(00-FF)=  RETENTION ERROR AT ADDRESS= ! EXPECTED "00" DATA,READ BACK  ERROR AT ADDRESS= READ BACK ,EXPECTED LAST ADDRESS WRITTEN WA]*-^*+^]w#]#}?}@o%G|]}x^!YWUY!9B!ZÁZS!ZÁZPTV!ZY!ZÁZgV!(ZY!9ZV!4ZÁZxV!=ZY!9{_{_pZaZSZ>,cPaZz/cPzHZ*8^#"8^*2^ʁZz ږZ0cPʝZz ڮZ0cP:]Z!S͌V!]!S͌V^#V#UQ=Z>2:^!Z"2^!R͌VPA[S[MPZ!"+^!@"-^D[!T͌VP"+^!-T͌VPzP0*+^?[!FT͌VZ#"-^!aT͌V!wT͌V!T͌V!T͌V!T͌V!T͌V!U͌V!U͌VSPD[D[G!MU͌VSPO!R͌VZx_![y\]w]XæW X/2]/*8^#"8^::^=[2:^!gU͌VUQ͌V!U͌V~2QBP*8as well. 2DISKTST.COM 4DISKTST.COM 10DISKTST.COM DISKTEST.DOC DISKTEST.MAC We have received many requests for a disk diagnostic and here it is. This program has many options including: Error reporting to either console or printer. Itemized errors or Total errors per pass. Lock on read option; for checking for alignment problems. Lock on user specified data pattern or random pattern. Restore user data to disk option. But best of all this diagnostic works through the BIOS which means it cS  ,PATTERN WAS ERROR READING OTHER CELL ERROR READING TEST CELL TEST CELL= , OTHER CELL= PATTERN STORED= PATTERN READ=BIT(S) IN ERROR= F#NYP#V!"6^"8^^{>V>!wR͌VPYVNZ÷VͨQ!]"^+w+w!^"%^:]W*^*'^s#r#"^!]4*%^+6> 2:^2]*%^~(#"%^V.g"'^g")^!V"4^!R͌V!R͌V*'^UQ!S͌V*)^UQ!S͌V*6^#"6^UQ!S͌V*8^UQ!rW"2^X1]!S͌V*'^"+^*)^"-^dW>ͼ]Wd>Wͼ]W@XdW/ͼ]W:/^dW/ͼ]W*-^*+^G2/^]~W#WͨQͼ]W2]>2] KAYPRO DISK #18 DIAGNOSTICS MEMRS.ASM MEMRS.COM MEMRS.DOC This memory diagnostic performs a number of tests from about 1000H to the bottom of BDOS (the TPA). The tests run continuously until interrupted by the keyboard, with the error reporting sent to the CRT. A good test for a quick once over of your systems memory. MDIAGTTY.COM MDIAGTTY.MAC MDIAGLPT.COM MDIAGLPT.MAC MDIAGXXX.DOC This is another memory diagnostic that can test from 10^#"8^::^=F\2:^!U͌VUQ!U͌V~2Q!U͌V:]2Q!U͌V*0^UQ!U͌V:/^2QBP>2]ͨQ*8^#"8^::^=\2:^!V͌V}\*8^#"8^::^=\2:^!V͌V*8^#"8^!9V͌VUQ!FV͌VUQ!TV͌Vx2Q!gV͌V:/^2QBP>2]ͨQ'z\ x\Gͼ]*+^*+^/ͨQ]]~2/^H\/2/^d\#*-^]\/]\Gͼ]*+^~/wͨQ@*-^]T]T]/2/^H\~2/^d\(]~/w]~2/^H\]~2/^H\]?$]ͼ]*+^/2/^ͨQ:/^w"0^#/]ʝ][#Ï]/[]#¢]#]*+^Â]*-^*+^]w#]#}?}@o%G|]}xan be used to check RAM disks or unusual disk setups. A truly great diagnostic. DISKALGN.COM DISKALGN.MAC This is a program that allows you to postion the head of the disk drives for alignment purposes. You enter the track number and the drive steps to that track. *8^#"8^::^=F\2:^!U͌VUQ!U͌V:]2Q!U2\>ͼ] \Wͼ] \W!S͌V*'^"+^$."-^>\\*)^]hXIX!;S͌V\!WS͌V*)^*'^ĸ[#]ڂX!sS͌V*'^"+^*)^"-^>]]!S͌V*'^"+^$."-^>w]w]*)^]XñXͶZ*4^*-^DM *+^X!S͌V*)^DM *'^T]!33!9yx$Y;;}o|g>o|oXkb>5Y=#YDY>>Y==#Y~+~w#~w#yx|Y+~+##Y#yx|Y++~##YDYkb!XkbUr#s#yxY!9zS_Y#yxœY!9U~ʍYUʍY<ʍY*2^ YY cPY>2]::^=vZ2:00H to the top of memory. The error reporting is either sent to the parallel port (LPT) or the serial port (TTY). It uses different test procedures than MEMRS and is a bit more exhaustive. MDIAGXXX.DOC is the documentation file for both versions. LOWTTY.COM LOWLPT.COM These are revisions of MDIAGTTY and MDIAGLPT that test the portion of memory that is not tested by the others (0000H to 1000H). They perform identically to the MDIAG series so see MDIAGXXX.DOC for the documentation on these