; ; MUCHTEXT.A86 Version 1.0 as of March 29, 1981 ; ; By: Kelly Smith, CP/M-Net ; ; I spend a fair amount of time using Wordstar for doing ; software documentation, letter writing, and especially ; magazine articles that pay by the page...it's nice to know ; at times just how much stuff I have "cranked-out" during the ; course of one of my long-winded Wordstar sessions... ; ; So, just How-MUCHTEXT did I type? Well, I put this ; together to tell me. Works accurately on text files, but ; don't use it on non-ASCII files to get a character ; count, 'cause it will be wrong. ; ; MUCHTEXT doesn't care how the text was prepared, as ; long as a line has a ASCII line feed delimeter in it ; (indicating the end of a line). This seems to work very well ; in all cases that I have tried...Here is an example of how ; to use it: ; ; A>muchtext muchtext.asm ; ; Contains 150 lines of text ; A total, 3955 characters ; ; A0> ; ; If you have any bright ideas for improvements, I would ; appreciate it if you would MODEM it to the CP/M-Net System ; as "MUCHTEXT.NEW", to share with others. ; ; Best regards, ; ; Kelly Smith, CP/M-Net ; ; ; bdos EQU 05h ; CP/M BDOS entry address fcb EQU 5ch ; CP/M FCB address ; wbfc EQU 0 ; warm boot function psfc EQU 9 ; print string offc EQU 15 ; open file sdma EQU 26 ; set dma address rrfc EQU 20 ; read record ; lf EQU 0ah ; ASCII line feed cr EQU 0dh ; ASCII carriage return ; M EQU Byte Ptr 0[BX] ; ORG 0100h ; MOV DX,fcb MOV CL,offc ; open file name specified in the fcb INT 224 INC AL JNZ openok CALL prnexit DB cr,lf,lf,'+++ Can''t open file! +++$' openok: PUSH BX MOV BX,Word Ptr dmabuf ; point to dma buffer MOV AL,Byte Ptr extcnt ; get extent count OR AL,AL JNS nextrec MOV BX,Word Ptr dmabuf XCHG BX,DX MOV CL,sdma ; set dma address for file INT 224 MOV DX,fcb readin: MOV CL,rrfc ; read record INT 224 OR AL,AL JNZ ateof ; at the end-of-file yet? MOV BX,Word Ptr dmabuf ; get next record for next extent XOR AL,AL ; set up next extent JMPS nextrec ; nextrec:INC AL ; update extent count MOV Byte Ptr extcnt,AL DEC AL ADD AL,BL ; you put your right foot in... MOV BL,AL MOV AL,BH ADC AL,0 MOV BH,AL ; you put your right foot out... MOV AL,M ; get character...and shake it all about POP BX CMP AL,'Z'-40h ; end of file? JZ ateof ; if so, finish up... LAHF ; save character XCHG AL,AH PUSH AX MOV BX,(Offset chars) ; do range check on digits count nxtpos: MOV AL,M CMP AL,' ' ; this position occupied yet? JNZ nocary cary: MOV AL,'0' ; make an ascii zero character nocary: INC AL ; +1 to digit position MOV M,AL CMP AL,':' ; digit >9? JNZ less9 ; if so, check if line feed MOV M,'0' ; zero this digit DEC BX JMPS nxtpos ; try the next position less9: POP AX ; get character XCHG AL,AH CMP AL,lf ; I walk the line...you know your mine JZ L_1 JMP openok L_1: MOV BX,(Offset lines) ; point to number of lines nxtpos1:MOV AL,M CMP AL,' ' ; this position occupied yet? JNZ nocary1 MOV AL,'0' ; make an ascii zero character nocary1:INC AL MOV M,AL CMP AL,':' ; digit >9? JZ L_2 JMP openok L_2: MOV M,'0' ; zero this digit DEC BX JMPS nxtpos1 ; try the next position ; ateof: CALL prnexit ; finally at the "end-of-file"...give info, and exit DB cr,lf DB 'Contains ' DB ' ' lines DB '0 lines of text' DB cr,lf DB 'A total, ' DB ' ' chars DB '0 characters' DB cr,lf,'$' ; exit: MOV CL,0 ; get back Loretta... INT 224 ; prnexit:POP DX ; get message string off the stack from "call" MOV CL,psfc ; print string INT 224 JMPS exit ; exit...gracefully L_3 EQU $ DSEG ORG Offset L_3 ; dmabuf DW 0080h ; default dma disk buffer pointer ; extcnt DB 080h ; extent count ; END