;       TITLE   'NOTATE - ADD COMMENTS TO ASSEMBLER PROGRAM'
;
       ORG     100H
;
;       INVOKED BY:     NOTATE <FILENAME>
;       INPUT FILE:     <FILENAME>.ASM
;       OUTPUT FILE:    <FILENAME>.ASM
;       INPUT FILE IS RENAMED TO <FILENAME>.BAK
;
;       EACH LINE OF THE INPUT FILE IS DISPLAYED, AND THE
;       USER IS PROMPTED FOR A COMMENT.  IF A COMMENT IS
;       ENTERED, IT IS INSERTED IN THE FILE.  THE PROCESS
;       MAY BE TERMINATED BY ENTERING ^Z AS A COMMENT.
;
;       CP/M MACRO LIBRARIES:
       MACLIB  NCOMPARE
       MACLIB  SYMSTACK
       MACLIB  SEQIO
       MACLIB  DOWHILES
       MACLIB  WHENS
;
;       ADDITIONAL MACROS:
READ    MACRO   F,X             ;;READ FROM FILE F INTO X
       GET     F
       STA     X
       ENDM
;
WRITE   MACRO   F,X             ;;WRITE FROM X TO FILE F
       LDA     X               ;; AND THE CONSOLE
       PUT     F
       LDA     X
       PUT     CON
       ENDM
;
NXTCHR  MACRO   I,O,C           ;;BUMP CHARACTER BEING PROCESSED
       WRITE   O,C             ;; OUTPUT FILE O
       READ    I,C             ;; INPUT FILE C
       ENDM
;
       LHLD    @BDOS+1 ;SET STACK AT TOP OF TPA
       DCX     H
       SPHL
;
;       OPEN SOURCE FILE
       FILE    INFILE,SOURCE,,1,ASM,4096
;       OPEN TEMPORARY OUTPUT FILE
       FILE    OUTFILE,DEST,,1,$$$,4096
;       DO FIRST INPUT
       READ    SOURCE,CHAR
;
;       NOW EXECUTE MAIN LOOP UNTIL EOF
       DOWHILE CHAR,NEQ,%EOF   ;LOOP UNTIL EOF
           DOWHILE CHAR,EQL,%';'
               DOWHILE CHAR,NEQ,10     ;SKIP COMMENTED LINES
                   NXTCHR      SOURCE,DEST,CHAR
                   ENDDO
               NXTCHR  SOURCE,DEST,CHAR
               ENDDO
           WHEN        CHAR,EQL,13     ;FOUND END OF A LINE
               LXI     D,PROMPT        ; PROMPT FOR COMMENT
               MVI     C,9     ; WITH TAB AND SEMICOLON
               CALL    @BDOS
               LXI     H,COMBUF        ;INPUT THE COMMENT
               MVI     M,128
               PUSH    H
               XCHG
               MVI     C,10
               CALL    @BDOS
               POP     H
               INX     H
               PUSH    H
               MOV     A,M
               WHEN    COMSIZ,EQL,1    ;SINGLE CHAR?
                   WHEN        COMONE,EQL,%EOF ;CTL-Z?
                       POP     H
                 !     DOWHILE CHAR,NEQ,%EOF
                           LDA CHAR    ;COPY REST OF FILE WITH
                           PUT DEST    ; NO FURTHER COMMENTS
                           READ        SOURCE,CHAR
                           ENDDO
                       JMP     CLOSUP  ; AND EXIT
                       ENDW
                 ! ENDW
               WHEN    COMSIZ,NEQ,0    ;OUTPUT TAB AND SEMICOLON
                   MVI A,9     ; IF A COMMENT WAS ENTERED
                   PUT DEST
                   MVI A,';'
                   PUT DEST
           ENDW
               DOWHILE COMSIZ,GTR,0    ;INSERT THE COMMENT
                   POP H
                   INX H
                   PUSH        H
                   MOV A,M
                   PUT DEST
                   LXI H,COMSIZ
                   DCR M
                   ENDDO
               POP     H
               ENDW
           NXTCHR      SOURCE,DEST,CHAR        ;GET NEXT CHARACTER
           ENDDO       ;END OF MAIN LOOP
;
;       CLOSE AND SWITCH FILES
CLOSUP: FINIS   DEST    ;CLOSE OUTPUT FILE
       FILE    SETFILE,BACKUP,,1,BAK   ;CREATE .BAK FCB
       ERASE   BACKUP  ;DELETE OLD BACKUP IF ANY
       RENAME  BACKUP,SOURCE   ;RENAME INPUT FILE TO .BAK
       RENAME  SOURCE,DEST     ;RENAME OUTPUT TO INPUT
;
;       ALL DONE, EXIT
       JMP     0
;
CHAR:   DS      1       ;HOLDS CURRENT CHARACTER FROM SOURCE FILE
COMBUF: DS      130     ;INPUT BUFFER FOR COMMENT
COMSIZ  EQU     COMBUF+1        ;LENGTH OF INPUT (SET BY CP/M)
COMONE  EQU     COMBUF+2        ;FIRST CHARACTER INPUT
;
PROMPT: DB      9,';$'
;
BUFFERS:        ;MACROS WILL STICK BUFFERS HERE
MEMSIZE EQU     BUFFERS+@NXTB   ;TOTAL MEMORY USED
       END