home *** CD-ROM | disk | FTP | other *** search
- n ENV.CMP for assembly by DEBUG < ENV.CMP
- n Purpose: pad/unpad the environment with ENVnn=
- n env.com
- f 100 500 c3
- rcx
- 300
-
- a 100
- ;100
- jmp 2c0
- ;103 env address
- db 00 00 'ee'
- ;107 envsize
- db 'ss'
- ;109 envtop
- db 'tt'
- ;10b envptr
- db 'pp'
- ;10d mod address
- db 80 00 'mm'
- ;111 pad/unpad
- db 00
- ;112 testline
- db 'unpad' 00
- ;118 found
- db 00
-
- a 120
- push ds
- ;121 find top COMMAND.COM
- mov ax,[16]
- mov ds,ax
- cmp word ax,[16]
- jne 121
- ;12c find its main environment
- dec ax
- mov ds,ax
- add word ax,[3]
- inc ax
- mov ds,ax
- mov word bx,[3]
- mov cl,4
- shl bx,cl
- inc ax
- pop ds
- mov [109],bx
- mov [107],bx ;the length in bytes
- mov [105],ax ;segenv
- ;now have env seg/ofs at [105]:[103]
- les di,[103]
- mov cx,[107]
- mov ax,0
- ;156 more repeats
- repne scasb
- dec cx
- scasb
- jne 156
- mov [10b],cx
- dec di
- mov [109],di
- ret
-
- a 170
- ;170 string master for entry
- db 'ENV01=abcdefg' 0 0
-
- a 180
- ;180 verify structure
- mov cx,0
- add cl,[80]
- je 1db ;quit if no tail
- les di,[10d]
- add di,cx
- mov ax,20
- std
- repe scasb
- je 1db ;quit if all space
- inc cx
- mov di,81
- cld
- repe scasb
- inc cx
- mov [80],cl ;length of trimmed string
- dec di
- mov [10d],di ;posn of first char
- mov al,[di]
- or al,20
- mov [111],al ;record of first letter
- lds si,[10d]
- mov bp,113
- cmp cl,3
- je 1c3
- mov bp,111
- cmp cl,5
- jne 1db
- ;1c3 loop
- lodsb
- inc di
- inc bp
- or al,20
- cmp al,[bp]
- loope 1c3
- jne 1db
- mov ax,170
- mov [10d],ax
- mov al,[111]
- clc
- jmp 1dc
- ;1db not ok
- stc
- ;1dc exit
- ret
-
- a 1df
- ;1df pad sequentially with ENV01, ENV02, until full
- call 200
- jc 1dc
- call 26e
- inc byte [174]
- cmp byte [174],3a
- jne 1df
- inc byte [173]
- mov al,30
- mov [174],al
- jmp 1df
-
- a 200
- ;200 find size of present entry
- cld
- les di,[10d] ;find length of LHS
- mov cx,di
- mov al,3d
- repne scasb
- sub di,cx
- ror di,1
- dec di
- mov bx,di
- ;212 search the environment for match
- mov cx,[109]
- lds si,[10d]
- les di,[103]
- inc si
- ;21f loop for main search
- dec si
- lodsb
- repne scasb
- push cx
- push si
- push di
- mov cx,bx
- repe cmpsb
- pop di
- pop si
- pop cx
- jcxz 25f
- jne 21f
- ;231 search for end
- mov si,di
- mov bx,cx
- mov ax,0
- repne scasb
- sub bx,cx
- xchg si,di
- cs: mov ax,[109]
- sub ax,bx
- cs: add ax,F
- dec ax
- cs: cmp [107],ax
- jc 26a
- push es
- pop ds
- dec di
- inc cx
- rep movsb
- dec di
- cs: mov [109],di
- clc
- jmp 26a
- ;25f
- push cs
- pop ds
- mov ax,di
- add ax,F
- cmp [107],ax
- ;26a
- ret
-
- a 26e
- ;26e add new entry
- cs: mov cl,F
- cs: lds si,[10d]
- mov bx,cx
- rep movsb
- dec di
- mov [109],di
- ret
-
- a 280
- ;280 unpad
- mov ax,[107]
- mov bx,e
- div bl
- inc ax
- mov [117],al
- ;28c unpad loop
- call 200
- push cs
- push cs
- pop ds
- pop es
- jnc 297
- jmp 2b1
- ;297
- inc byte [174]
- cmp byte [174],3a
- jne 2ab
- inc byte [173]
- mov al,30
- mov [174],al
- ;2ab
- dec byte [117]
- jne 28c
- ;2b1
- ret
-
- a 2c0
- ;2c0 MAIN PROGRAMME
- mov [10f],cs ;mod address for LDS/LES calls
- call 120 ;find envbase and envsize
- call 180 ;check validity of mod format
- jnc 2ce ;if not valid ...
- jmp 2e0 ;... exit via syntax (err #1)
- ;2ce
- cmp al,70 ;if not pad ...
- jne 2d7 ;... goto unpad
- call 1df ;pad ...
- jmp 2da ;... and exit
- ;2d7 ;unpad
- call 280
- ;2da ;exit OK (err #0)
- mov al,0
- ;2dc
- mov ah,4c ;standard exit from programme
- int21
- ; END OF MAIN PROGRAMME
-
- a 2e0
- mov ah,9 ;print syntax and exit
- mov dx,300
- int 21
- mov al,1
- jmp 2dc
-
- a 300
- ;300
- db 0a 0d 'Syntax: env pad|unpad' 0d 0a 24
- db '(C) 1988 Hylton Boothroyd, University of Warwick$' 0a 0d
- db 'Purpose: pad the environment with ENVnn variables,'0a 0d
- db 'or delete all ENVnn variables assumed to start with ENV01$'
-
- w
- q
-
-