;
;        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<cr>
;
; 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