title zero memory ;++ ; ; This is an attempt to make programs with flakey bugs crash more predictably. ; ; It sets all available memory to zero, or to the hex # specified as JCL. ; ; 04/02/92 JMBW Created. ; ;-- code segment assume cs:code org 80h buf: ; relocate clear loop to here org 100h start: cld ;forwards mov si,81h ;pt at JCL mov cx,4 ;value,,bit count lp1: ; parse JCL as a hex number (value to fill with, default is 0) lodsb ;get a byte cmp al,15q ;cr? je msize sub al,'0' ;see if hex cmp al,9d ;0-9? jbe sk2 sub al,'A'-'0' ;A-F? cmp al,5 jbe sk1 sub al,'a'-'A' ;a-f? cmp al,5 ja lp1 ;ignore if not (spaces, junk) sk1: add al,10d ;A-F => 10d-15d sk2: sal ch,cl ;left 4 or ch,al ;OR in new digit jmp short lp1 ;loop msize: ; find size of memory to zero (put # bytes in dx:ax) mov ax,word ptr ds:[2] ;get end of memory mov bx,ds ;pt at PSP add bx,10h+10h ;pt at program+100h sub ax,bx ;find # paragraphs to clear xor dx,dx ;dx=0 mov bl,ch ;save mov bh,ch ;on both sides xor ch,ch ;ch=0 lp2: sal ax,1 ;*16d=byte count rcl dl,1 loop lp2 ;loop ; relocate the fill loop into the PSP so we can get everything xchg ax,bx ;get fill word, set count in last seg mov si,offset fill1 ;point at routine mov di,offset buf ;point at dest mov cx,offset lfill ;length rep movsb ;copy ; set up and go mov cx,es ;copy es (PSP) add cx,10h+10h ;point at program+100h mov es,cx ;copy xor di,di ;pt at begn jmp buf ;go do it ; fill1: mov sp,200h ;set up stack fill2: dec dx ;done all full 64KB banks? js fill3 ;yes mov cx,8000h ;w.c. for 64KB rep stosw ;zero out a page mov cx,es ;copy add ch,10h ;+64KB mov es,cx ;restore jmp short fill2 ;loop fill3: mov cx,bx ;do last seg shr cx,1 ;/2=w.c. rep stosw mov dx,offset done-fill1+80h ;msg mov ah,09h ;func=print int 21h ;say we're done int 20h done db 'Memory zeroed',15q,12q,'$' lfill equ $-fill1 ; code ends end start