; PROGRAM: COMMENT ; AUTHOR: Richard Conn ; VERSION: 2.0 ; DATE: 18 MAY 84 ; PREVIOUS VERSIONS: 1.0 (18 APR 83) vers equ 20 z3env set 0f400h ; ; COMMENT echoes lines, with simple character editing, to the user's ; console. This program is designed to facilitate communication between ; two users who see the same console via redirectable I/O. They can chat ; freely to each other by using this program. ; llen equ 65 ;number of chars allowed before auto newline fcb equ 5ch ;FCB ctrlc equ 'C'-'@' ;Abort Character esc equ 1bh ;Escape (Abort Character) cr equ 0dh ;New Line lf equ 0ah ;Line Feed bs equ 8 ;Back Space del equ 7fh ;Delete Char ctrlp equ 'P'-'@' ;^P ctrlu equ 'U'-'@' ;^U ctrlx equ 'X'-'@' ;^X ; ; Externals ; ext z3init ext cin,cout,crlf,eprint,lout,lcrlf ; ; Environment Definition ; if z3env ne 0 ; ; External ZCPR3 Environment Descriptor ; jmp start db 'Z3ENV' ;This is a ZCPR3 Utility db 1 ;External Environment Descriptor z3eadr: dw z3env start: lhld z3eadr ;pt to ZCPR3 environment ; else ; ; Internal ZCPR3 Environment Descriptor ; MACLIB Z3BASE.LIB MACLIB SYSENV.LIB z3eadr: jmp start SYSENV start: lxi h,z3eadr ;pt to ZCPR3 environment endif ; ; Start of Program -- Initialize ZCPR3 Environment ; call z3init ;initialize the ZCPR3 Env and the VLIB Env call eprint db 'COMMENT, Version ' db (vers/10)+'0','.',(vers mod 10)+'0',0 lda fcb+1 ;check for help request cpi '/' ;help? jnz cmt ; ; Help for COMMENT ; call eprint db cr,lf,' COMMENT' db cr,lf,'Internal Commands:' db cr,lf,' ^C or ESC - Abort' db cr,lf,' ^P - Toggle Print' db cr,lf,' BS or DEL - Delete Prev Char' db cr,lf,' ^U or ^X - Delete Line' db 0 ret ; ; Beginning of Comment Routine ; cmt: call eprint db cr,lf,'Strike ^C or ESC to Abort, ^P to Toggle Print' db cr,lf,0 xra a ;clear print flag sta prflag call comment ;print first prompt and set char count ; ; Main Character Input Loop ; loop: call cin ;input char ani 7fh ;mask MSB cpi ctrlc rz cpi esc rz cpi ctrlp ;toggle print flag jz prtog cpi cr ;new line? jz newline cpi bs ;back up? jz back cpi del ;back up? jz back cpi ctrlu ;erase line? jz eraln cpi ctrlx ;erase line? jz eraln call cout cpi ' ' ;printable char? jc loop mov b,a ;save char in B lda prflag ;print? ora a ;0=no mov a,b ;get char to print cnz lout ;print char if PRFLAG is NZ inr c ;increment char count mvi a,llen ;check for nearing end of line cmp c cz comment jmp loop ; ; Toggle print flag ; prtog: lda prflag ;flip flag cma sta prflag ora a ;new line to printer if print flag now off cz lcrlf jmp loop ; ; Routine to begin a new line ; newline: call comment ;new line, print prompt, set char count to zero jmp loop ; ; Back up one character ; back: mov a,c ;check for no chars ora a jz loop call back1 ;backup routine jmp loop ;continue ; ; General Routine for backing up ; back1: dcr c ;count down mvi a,bs ;backspace call cout mvi a,' ' ;space call cout mvi a,bs ;backspace jmp cout ; ; Erase Current Line ; eraln: mov a,c ;done? ora a jz loop call back1 ;backup jmp eraln ; ; Print User Prompt ; comment: call eprint db cr,lf,'Comment> ',0 lda prflag ;new line to printer if print flag on ora a cnz lcrlf mvi c,0 ;set char count ret ; ; Buffers ; prflag: ds 1 ;print flag (0=off, 0FFH=on) end