home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frostbyte's 1980s DOS Shareware Collection
/
floppyshareware.zip
/
floppyshareware
/
USCX
/
ASMUT-03.ZIP
/
FREE.ASM
< prev
next >
Wrap
Assembly Source File
|
1985-05-11
|
5KB
|
282 lines
cseg segment
org 100h
assume cs:cseg,ds:cseg
start proc near
call lfeed
mov si,offset buff
call parse
cmp byte ptr [si],255
jnz here
mov ah,19h
int 21h
inc al
mov ah,al
mov al,0
mov [si],ax
mov byte ptr [si+2],255
here: cmp byte ptr [si],0
jnz leave
mov dl,[si+1]
inc si
inc si
call space
cmp ah,1
jz here
mov dx,offset bytes
mov ah,9
int 21h
jmp here
leave: int 20h
space: push si
push dx
add dl,64
mov [drive],dl
mov dx,offset message
mov ah,9
int 21h
pop dx
mov ah,36h
int 21h
cmp ax,0ffffh
jnz conts
mov dx,offset errmess
mov ah,9
int 21h
mov ah,1
jmp lvspa
conts: mul bx
mul cx
mov si,offset buffer
call condw
call ascdw
mov byte ptr [si+10],'$'
mov cx,9
call zapzer
mov dx,si
here3: mov ah,9
int 21h
mov ah,0
lvspa: pop si
ret
lfeed: mov dx,offset lfee
mov ah,9
int 21h
ret
start endp
;CONVERT WORD TO DECIMAL
;Takes a number in AX and places the ascii value at DS:SI
;AX, BX, CX, and flags are messed up
conw proc near
mov cx,5
mov bx,10
add si,4
conaaa: mov dx,0
div bx
mov [si],dl
dec si
loop conaaa
inc si
ret
conw endp
;CONVERT DOUBLEWORD TO DECIMAL
;Handles numbers 0-655,350,000 - pass it others and it INT 0s
;Takes a number in DX-AX and places the ascii value at DS:SI
;AX, BX, CX, DX, and flags are messed up
condw proc near
mov bx,10000
div bx
push dx
call conw
add si,4
pop ax
mov dl,[si]
push dx
call conw
pop dx
mov [si],dl
sub si,4
ret
condw endp
;CONVERT DECIMAL WORD TO ASCII
;Takes number at DS:SI and leaves it in ASCII
;CX and flags messed up
ascw proc near
mov cx,5
ascaaa: add byte ptr [si],48
inc si
loop ascaaa
sub si,5
ret
ascw endp
;CONVERT DECIMAL DOUBLEWORD TO ASCII
;Takes number at DS:SI and leaves it in ASCII
;CX, DX, and flags messed up
ascdw proc near
call ascw
add si,4
mov dl,[si]
call ascw
mov [si],dl
sub si,4
ret
ascdw endp
;ZAP LEADING ZEROS IN A STRING
;Zaps leading zeros in a string of length CX at address DS:SI
;Returns with SI pointing to first nonzero byte
;CX and flags messed up
zapzer proc near
cmp byte ptr [si],48
jnz zapaaa
mov byte ptr [si],32
inc si
loop zapzer
zapaaa: ret
zapzer endp
;PARSE COMMAND LINE
;Places parsed list at DS:SI - format
; 0/# Drive number #
; 1/#/filespec.ext Filename of length #
; 2/#/parameter /parameter of length #
; 255 End of list
;everthing but SI, BP, segment registers, and stack messed up
parse proc near
push si
mov di,80h
mov cl,[di]
inc di
cmp cl,0
jnz paraaa
jmp paraar
paraaa: mov al,[di] ;main loop - jump here to
cmp al,32 ;process new sections
jnz paraab
jmp paraal
paraab: cmp al,'/' ;47
jnz paraac
jmp paraam
paraac: cmp al,64
jle paraal
mov bx,offset paraat ;either filename or drivespec
mov [paraas],0
paraad: mov [bx],al ;main loop for moving characters
inc bx ;to the temporary buffer with
inc di ;either filename or drivespec
dec cl
jz paraaf
paraae: mov al,[di]
inc di
dec cl
cmp al,32
jnz paraah
paraaf: cmp byte ptr [paraas],1 ;end of current string by end of
jz paraak ;buffer or delimeter
mov byte ptr [si],1
mov dx,bx
sub dx,offset paraat
inc si
mov [si],dl
inc si
mov bx,offset paraat
paraag: mov al,[bx] ;loop for moving filespec to return
mov [si],al ;buffer
inc si
inc bx
dec dl
jnz paraag
cmp cl,0
jz paraar
jmp paraaa
paraah: cmp al,':' ;check to see if char is a colon
jnz paraai
mov [paraas],1 ;set colon=last character
jmp paraaj
paraai: mov [paraas],0 ;set colon<>last character
paraaj: mov [bx],al ;put in buffer
inc bx
cmp cl,0
jz paraaf
jmp paraae
paraak: mov byte ptr [si],0 ;end of buffer, drivespec found
inc si
dec bx
dec bx
mov al,[bx]
and al,95
sub al,64
mov byte ptr [si],al
inc si
cmp cl,0
jz paraar
jmp paraaa
paraal: inc di ;ignore character
dec cl
jz paraar
jmp paraaa
paraam: inc di ;/parameter found
dec cl
jz paraao
mov bx,offset paraat
paraan: mov al,[di] ;loop for placing characters
cmp al,32 ;into the temporary buffer
jz paraao
mov [bx],al
inc di
inc bx
dec cl
jnz paraan
paraao: mov byte ptr [si],2 ;end of parameter
inc si
mov dx,bx
sub dx,offset paraat
mov [si],dl
inc si
cmp dl,0
jz paraaq
mov bx,offset paraat
paraap: mov al,[bx] ;move characters from temporary
mov [si],al ;buffer
inc si
inc bx
dec dl
jnz paraap
paraaq: cmp cl,0 ;jump back to normal routine
jz paraar
jmp paraaa
paraar: mov byte ptr [si],255 ;end of buffer code
pop si
ret ;leave
paraas db ? ;colon=last character?
paraat db 128 dup(?) ;temporary storage area
parse endp
buffer db 10 dup(?)
buff db 170 dup(?)
message db 'Drive '
drive db ?,': $'
errmess db 'invalid',13,10,'$'
bytes db 'bytes free',13,10,'$'
lfee db 13,10,'$'
cseg ends
end start
;program by Alan Bishop - CIS 72405,647 Version 1.2