; pickline.asm
; PRINTS selected range of lines. Best for DOS- or UNIX-format
; text files.
; Syntax: ( first defaults to 1, last defaults to 65535 )
; PICKLINE [ first ] , [ last ] [ [>]outfile ]
; Example:
; dir /a /o:-d | PICKLINE 4, 13
; To get just lines 4 to 13 of the DIR output.
seg000 segment byte public 'CODE'
assume cs:seg000
org 100h
assume es:nothing, ss:nothing, ds:seg000
; S u b r o u t i n e
start proc near
jmp short loc_0_10A
nop
loc_0_103:
add [bx+di], al
loc_0_105:
add [bx+si], al
loc_0_107:
add bh, bh
loc_0_10A:
mov si, 81h
call sub_0_185
mov word ptr loc_0_105+1, ax
cmp ax, 1
ja loc_0_11D
mov byte ptr loc_0_103, 1
loc_0_11D:
call sub_0_185
or ax, ax
jz loc_0_127
mov word ptr loc_0_107+1, ax
loc_0_127:
mov dx, 185h
mov bx, 0
mov cx, 2000h
mov ah, 3Fh
int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLE
; BX = file handle, CX = number of bytes to read
; DS:DX -> buffer
jb locret_0_184
mov cx, ax
jcxz locret_0_184
xor di, di
xor si, si
loc_0_13E:
mov al, [si+185h]
inc si
cmp byte ptr loc_0_103, 0
jz loc_0_14F
mov [di+2185h], al
inc di
loc_0_14F:
cmp al, 0Ah
jnz loc_0_172
mov byte ptr loc_0_103, 0
mov bx, word ptr loc_0_103+1
inc bx
mov word ptr loc_0_103+1, bx
cmp bx, word ptr loc_0_105+1
jb loc_0_172
cmp bx, word ptr loc_0_107+1
ja loc_0_172
mov byte ptr loc_0_103, 1
loc_0_172:
loop loc_0_13E
mov dx, 2185h
mov cx, di
jcxz loc_0_127
mov bx, 1
mov ah, 40h
int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE
; BX = file handle, CX = number of bytes to write, DS:DX -> buffer
jnb loc_0_127
locret_0_184:
retn
start endp
; S u b r o u t i n e
sub_0_185 proc near
xor ax, ax
loc_0_187:
mov bl, [si]
cmp bl, 0Dh
jz locret_0_1A6
inc si
cmp bl, 2Ch
jz locret_0_1A6
sub bl, 30h
jb loc_0_187
cmp bl, 9
ja loc_0_187
mov bh, 0Ah
mul bh
add al, bl
jmp short loc_0_187
locret_0_1A6:
retn
sub_0_185 endp
seg000 ends
end start