home *** CD-ROM | disk | FTP | other *** search
-
- page 60,133
- %noincl
- include macro.lib
- include equates.lib
- .sall
- code segment word 'code'
- assume cs:code,ds:code,es:code
- org 100H
- ;
- ; Programmer: T. G. Browning
- ;
- Main proc near
- mov bx,CmdTailOffs
- call argc
- cmp ax,2
- jne ErrExit
- mov ax,0001
- mov bx,CmdTailOffs
- call argv
- call Asc2Bin
- push ax
- mov ax,0002
- mov bx,CmdTailOffs
- call argv
- call Asc2Bin
- pop dx
- xchg dh,dl
- dec dh
- cmp dh,24
- jg ErrExit
- mov dl,al
- dec dl
- cmp dl,79
- jg ErrExit
- xor bx,bx
- @dos10 02H
- DOSOut:
- @dosExit
- ErrExit:
- mov dx,OffSet Syntax
- @dos21 09H
- jmp DOSOut
- Main endp
- ;
- ; DATA
- Syntax db 'RC.COM. Batch utility by MorganSoft. Released to the Public Domain.',CR,LF
- db 'Syntax: rc row col.',CR,LF,'$'
- Bin1 dw ?
- MultVal dw ?
- TenPower db 10
- ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- argc proc near
- ;
- ; Count command line arguments.
- ; Call with ES:BX = command line
- ; Returns AX = argument count
- ;
- Public argc
- push bx ; save bx and cx
- push cx
- mov ax,0 ; force count = 0
-
- argc1: mov cx,-1 ; set flag = outside argument
-
- argc2: inc bx ; point to next characterf
- cmp byte ptr es:[bx],cr
- je argc3 ; exit if carriage return
- cmp byte ptr es:[bx],blank
- je argc1 ; outside argument if ASCII blank
- cmp byte ptr es:[bx],tab
- je argc1 ;\ outside argument if ASCII tab
-
- ; otherwise not blank or tab.
- jcxz argc2 ; jump if alread inside argument
-
- inc ax ; else found argument. Count it
- not cx ; set flag = inside argument
- jmp argc2 ; and look at next character
-
- argc3: pop cx ; restore original bx and cx
- pop bx
- ret ; ax = argument count
-
- argc endp
- ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- argv proc near
- ;
- ; Get address and length of command line arguments
- ; Call with ES:BX = Command line
- ; AX = Argument #
- ; Returns: ES:BX = address
- ; ax = length
- ;
- Public argv
- push cx ; save original cx,di
- push di
-
- or ax,ax ; is it argument 0?
- jz argv8 ; yes, jumpt to program name
-
- xor ah,ah ; initialize argument counter
-
- argv1: mov cx,-1 ; set flag = outside argument
-
- argv2: inc bx ; point to next character
- cmp byte ptr es:[bx],cr
- je argv7 ; exit if carriage return
- cmp byte ptr es:[bx],blank
- je argv1 ; outside argument if ASCII blank
- cmp byte ptr es:[bx],tab
- je argv1 ; outside argument if ASCII tab
-
- ; if not blank or tab,
- jcxz argv2 ; jump if alread inside argument
-
- inc ah ; else count arguments found
- cmp ah,al ; is this the one we're looking for
- je argv4 ; yes, go find length
- not cx ; no, set flag = inside argument
- jmp argv2 ; and look at next character
-
- argv4: ; found desired argument, now
- ; determine the length
- mov ax,bx ; save param starting address
- argv5:
- inc bx ; point to next char
- cmp byte ptr es:[bx],cr
- je argv6 ; found end if carriage return
- cmp byte ptr es:[bx],blank
- je argv6 ; found end if space
- cmp byte ptr es:[bx],tab
- jne argv5 ; found end if tab
-
- argv6: xchg bx,ax ; set es:bx = argument address
- sub ax,bx ; and ax = argument length
- jmp argvx ; return to caller
-
- argv7: xor ax,ax ; set ax = 0 argument not found
- jmp argvx ; return to caller
-
- argv8: ; special handling for argv = 0
- mov ax,3000H ; check if DOS 3.0 or later
- int 21H ; (force al= 0 in case DOS 1)
- cmp al,3
- jb argv7 ; DOS 1 or 2, return a null string
- mov es,es:[2ch] ; get environment segment from PSP
- xor di,di ; find the program name by
- xor al,al ; first skipping over all the
- mov cx,-1 ; environment variables
- cld
- argv9:
- repne scasb ; scan for double null (can't use
- scasb ; stasw, might be odd addr
- jne argv9 ; loop if it was a single null
- add di,2 ; skip word count
- mov bx,di ; save program name address.
- mov cx,-1 ; now fin its length....
- repne scasb ; scan for another null byte
- not cx ; convert CX to length
- dec cx
- mov ax,cx ; return length in ax
- argvx: ; comman exit point
- pop di ; restore original cx and di
- pop dx
- ret
- argv endp
- ;==================================================
- ; Asc2Bin: Procedure to convert an ASCII value ;
- ; to Binary. ;
- ; Requires ax=length, bx = offset ;
- ; ;
- ; Returns ax: Binary Value ;
- ;==================================================
- Asc2Bin proc near
- push bx
- push cx
- push dx
- push si
- mov Bin1,0
- mov MultVal,1
- mov cx,ax
- mov si,bx
- add si,cx
- dec si
- xor ax,ax
- A2B10:
- mov al,[si]
- and al,0FH
- mul MultVal
- add Bin1,ax
- mov ax,MultVal
- mul TenPower
- mov MultVal,ax
- dec si
- loop A2B10
- mov ax,Bin1
- pop si
- pop dx
- pop cx
- pop bx
- clc
- ret
- Asc2Bin endp
-
- Code ends
- end Main
-