Category : Word Processors
Archive   : RMCOL.ZIP
Filename : RMCOL.ASM

 
Output of file : RMCOL.ASM contained in archive : RMCOL.ZIP
PAGE 55,132
; RMCOL.ASM
; This program takes lines from std input and trims 'count' columns
; beginning with column 'start+1'. Syntax is:
; RMCOL n1n2 [[>file2]] where n1 is the start col-1
; (0 to 256), n2 is the # of cols to remove (may be 0), is any
; number of tabs or spaces with an optional single comma, and files
; are as usual for std in and std out.

codeseg segment
assume cs:codeseg, ds:codeseg

org 100h

rmcol proc far

start: jmp Main

errmsg db 0Dh, 0Ah, 'RMCOL: Invalid arguments', 0Dh, 0Ah, '$'
start_col dw 0
col_count dw 0


Main: mov si,81h ; point si to PSP
call skip_spc ; skip white space
call get_dec ; get first number
jc error ; cf=1 on error
mov start_col,cx ; save value
call skip_spc
call get_dec
jc error
mov col_count,cx ; save column count
Main_loop: call get_line ; get a line
jc Exit ; cf=1 on error or eof
call doit ; remove the columns
call put_line ; output the line
jmp short Main_loop ; continue until cf=1

error: mov dx,offset errmsg ; error message exit
mov ah,9
int 021h
Exit: int 020h ; program exit.

rmcol endp


; SUBROUTINE
; skips white space

skip_spc proc near
skip1: cmp byte ptr [si],020h
jne skip2
inc si
jmp short skip1
skip2: cmp byte ptr [si],9
jne skip_ret
inc si
jmp short skip1
skip_ret: ret
skip_spc endp


; SUBROUTINE
; converts ASCII decimal int to binary int

get_dec proc near
xor cx,cx ; start with cx=0

dec1: mov al,[si] ; get char
cmp al,020h ; space indicates end of numerals
je dec_ret
cmp al,9 ; so does tab
je dec_ret
inc si
cmp al,02Ch ; and comma
je dec_ret
dec si
cmp al,03Ah ; ascii range of char ok so far
jb dec2
stc ; ascii out of range - exit cf=1
jmp short dec_ret

dec2: sub al,030h ; if numeral, cvt to binary
jc dec_ret ; not a numeral, exit cf=1
shl cx,1 ; cx = cx * 2
mov dx,cx ; save cx * 2
shl cx,1 ; cx * 4
shl cx,1 ; cx * 8
add cx,dx ; cx * 8 + cx * 2 = cx * 10d
cbw ; convert al byte to word
add cx,ax ; add 1's to 10's
mov ax,0FFh ; 255d = max line length
cmp ax,cx ; if cx > 255 then error
jb dec_ret
inc si ; otherwise continue.
jmp short dec1

dec_ret: ret ; ret with cf=1 for error or cf=0 for success
get_dec endp


; SUBROUTINE
; gets line from std input

get_line proc near
mov si,offset buffer ; point to input line buffer

get_1: mov dx,si ; chars are input to ds:dx
mov cx,1 ; char count
mov bx,0 ; std input handle
mov ah,3Fh ; get char from std in
int 21h
jc get_line_ret ; error - exit cf=1
cmp byte ptr [si],0Ah
je get_line_ret
mov cx,ax ; get # input chars into cx
cmp byte ptr [si],1Ah ; check for eof
stc
jz get_line_ret ; eof - exit cf=1
jcxz get_line_ret ; 0 chars input - exit cf=1
inc si ; point to next char
cmp si,offset buffer+254 ; max line - 2
jae get_end ; truncate long lines.
jmp short get_1 ; else continue.

get_end: mov byte ptr [si],0Dh
mov byte ptr [si+1],0Ah
clc

get_line_ret: ret
get_line endp


; SUBROUTINE
; This is where the columns get removed

doit proc near
mov cx,start_col
mov si,offset buffer ; input buffer
mov di,offset buffer+256 ; copy buffer

start_loop: jcxz doit_1 ; start removing at col 1
lodsb ; otherwise, copy start_col chars
stosb ; to copy buffer
cmp al,0Dh ; (premature eoln)
je doit_2
loop start_loop ; loop cx to 0

doit_1: mov cx,col_count ; get count in cx

middle_loop: jcxz doit_2 ; col count 0 ? copy whole line.
lodsb ; else skip over cx chars.
cmp al,0Dh ; premature eoln, finish up now.
je end_loop
loop middle_loop

jmp short doit_2 ; if middle loop was executed, skip
; this next stosb instr.
end_loop: stosb
doit_2: lodsb
cmp byte ptr [si-2],0Ah ; now copy chars until eoln.
jne end_loop
ret
doit endp


; SUBROUTINE
; Output line to std output

put_line proc near
mov si,offset buffer+256 ; set up pointers to the
mov dx,si ; copy (output) buffer.
xor cx,cx

loc_6: inc cx
lodsb
cmp al,0Ah
jne loc_6 ; count chars to eoln into cx
mov bx,1 ; handle for std out
mov ah,40h
int 21h
ret ; cf=1 if error
put_line endp

buffer db 0 ; line input buffer - this makes the
; program look smaller, but it uses 512 bytes
; past the 'end' of the coded listing. This
; may be extended arbitrarily, but with risk.

codeseg ends
end start


  3 Responses to “Category : Word Processors
Archive   : RMCOL.ZIP
Filename : RMCOL.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/