; BYECOM.MAC - get signoff comment then hang up and loop.
;
; Uses SYSLIB calls.
;
; This program was designed as a "quick and dirty"
; way of getting any comments a caller might have.
; Normally, he would have to go back to the message-
; or logon subsystem to leave any late comments.
; This way he can leave them at signoff or he can
; execute the (renamed) BYE.COM file for fast logoff.
; BYECOM jumps to the line input routine after hanging
; up the phone. This prevents any disk access from being
; rudely aborted by BYE when it takes control due to
; the lost carrier.
;
; This program may not be an example of efficient
; programming, but it serves it's purpose.
;
; Written in December 1982, updated 2/8/83.
;
Z80
;
CR      EQU     0DH
LF      EQU     0AH
DISKWR  EQU     3FH             ;this flag indicates disk write to BYE
CALLER  EQU     40H             ;first 4 chars of caller's name stored here
PMMI    EQU     0E3H            ;modem control port for hang-up
COMDSK  EQU     0               ;COMMENTS file drive (0=A, 1=B...)
COMUSR  EQU     15              ;COMMENTS file user
;
; SYSLIB calls:
;
       EXT     CODEND
       EXT     CIN
       EXT     COUT
       EXT     CAPS
       EXT     F$EXIST
       EXT     F$DELETE
       EXT     FO0$OPEN
       EXT     FI0$OPEN
       EXT     FO0$CLOSE
       EXT     FI0$CLOSE
       EXT     F0$PUT
       EXT     F0$GET
       EXT     F$RENAME
       EXT     INITFCB
       EXT     INLINE
       EXT     PRINT
       EXT     LOGUD
       EXT     MOVEB
       EXT     CRLF
;
; Say who we are, what we want.
;
START:  CALL    PRINT
       DB      CR,LF,'Do you want to leave '
       DB      'any comments? ',0
       CALL    CODEND
       LD      A,1
       CALL    INLINE
       LD      A,(HL)
       CALL    CAPS
       CP      'N'
       JP      Z,HANGUP        ;no comments, hang up phone
       CP      'Y'
       JR      NZ,START
       LD      BC,COMDSK*100H+COMUSR   ;b=disk,c=user
       CALL    LOGUD
       LD      DE,COMFCB
       PUSH    DE
       CALL    INITFCB
       LD      DE,TEMFCB
       CALL    INITFCB
       CALL    FO0$OPEN
       JP      NZ,DISKERROR
       POP     DE
       CALL    F$EXIST
       JR      Z,X
       CALL    FI0$OPEN
       JP      NZ,DISKERROR
;
; copy old file to new file
;
CPYLP:  CALL    F0$GET
       CP      1AH
       JR      Z,EXITCP
       CALL    F0$PUT
       JR      CPYLP
;
EXITCP: CALL    FI0$CLOSE
X:      LD      HL,CALLER
       LD      DE,NAME
       LD      B,4
       CALL    MOVEB
;
; now write his name
;
       LD      DE,FROM
WNAME:  LD      A,(DE)
       CALL    F0$PUT
       INC     DE
       CP      LF
       JR      NZ,WNAME
       CALL    PRINT
       DB      CR,LF,LF,'Enter comments one line at a time.'
       DB      CR,LF,'CR alone to end.',CR,LF,0
;
; get comments a line at a time
;
GETCOM: CALL    CODEND
       CALL    PRINT
       DB      '--> ',0
       LD      A,1
       CALL    INLINE
       LD      A,(HL)
       OR      A
       JR      Z,EOF
       LD      A,1
       LD      (DISKWR),A
       CALL    WRITECOM
       XOR     A
       LD      (DISKWR),A
       JR      GETCOM
;
; write line to disk
;
WRITECOM:
       LD      A,(HL)
       OR      A
       JR      Z,CRLFF
       CALL    F0$PUT
       INC     HL
       JR      WRITECOM
;
CRLFF:  LD      A,CR
       CALL    F0$PUT
       LD      A,LF
       JP      F0$PUT
;
EOF:    LD      A,1
       LD      (DISKWR),A
       CALL    CRLFF
       CALL    FO0$CLOSE
       LD      DE,COMFCB
       CALL    F$DELETE
       EX      DE,HL
       LD      DE,TEMFCB
       CALL    F$RENAME
       JR      Z,DISKERROR
       CALL    PRINT
       DB      CR,LF,'Thank you for your comments.',0
;
; now say goodbye and hang him up.
;
HANGUP: CALL    PRINT
       DB      CR,LF,'Good bye - call again',CR,LF,0
       XOR     A
       LD      (DISKWR),A      ;clear disk write flag
       OUT     (PMMI),A
       JP      INLINE          ;hang up while in I/O loop
;
DISKERROR:
       CALL    PRINT
       DB      7,CR,LF
       DB      '++error in COMMENTS file++',CR,LF
       DB      'Please use CBBS for comments or BYEBYE for logout'
       DB      CR,LF,0
       JR      HANGUP
;
FROM:   DB      'FROM '
NAME:   DB      '     ',CR,LF
;
COMFCB: DB      0,'COMMENTS   '
       DS      24
TEMFCB: DB      0,'COMMENTS$$$'
       DS      24
       END