/*
 * sim_console.h: simulator console I/O library headers
 *
 * vim: filetype=c:tabstop=4:ai:expandtab
 * SPDX-License-Identifier: MIT
 * scspell-id: a93bd242-f62a-11ec-92e3-80ee73e9b8e7
 *
 * ---------------------------------------------------------------------------
 *
 * Copyright (c) 1993-2014 Robert M. Supnik
 * Copyright (c) 2021-2023 The DPS8M Development Team
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * ROBERT M SUPNIK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 * Except as contained in this notice, the name of Robert M. Supnik shall not
 * be used in advertising or otherwise to promote the sale, use or other
 * dealings in this Software without prior written authorization from
 * Robert M. Supnik.
 *
 * ---------------------------------------------------------------------------
 */

#ifndef SIM_CONSOLE_H_
# define SIM_CONSOLE_H_ 0

# define TTUF_V_MODE    (UNIT_V_UF + 0)
# define TTUF_W_MODE    2
# define TTUF_MODE_7B   0
# define TTUF_MODE_8B   1
# define TTUF_MODE_UC   2
# define TTUF_MODE_7P   3
# define TTUF_M_MODE    ((1u << TTUF_W_MODE) - 1)
# define TTUF_V_PAR     (TTUF_V_MODE + TTUF_W_MODE)
# define TTUF_W_PAR     2
# define TTUF_PAR_SPACE 0
# define TTUF_PAR_MARK  1
# define TTUF_PAR_EVEN  2
# define TTUF_PAR_ODD   3
# define TTUF_M_PAR     ((1u << TTUF_W_PAR) - 1)
# define TTUF_KSR       (1u << (TTUF_W_MODE + TTUF_W_PAR))
# define TTUF_V_UF      (TTUF_V_MODE + TTUF_W_MODE + TTUF_W_PAR)
# define TT_MODE        (TTUF_M_MODE << TTUF_V_MODE)
# define TT_MODE_7B     (TTUF_MODE_7B << TTUF_V_MODE)
# define TT_MODE_8B     (TTUF_MODE_8B << TTUF_V_MODE)
# define TT_MODE_UC     (TTUF_MODE_UC << TTUF_V_MODE)
# define TT_MODE_7P     (TTUF_MODE_7P << TTUF_V_MODE)
# define TT_MODE_KSR    (TT_MODE_UC)
/* 7 bit modes allow for an 8th bit parity mode */
# define TT_PAR         (TTUF_M_PAR << TTUF_V_PAR)
# define TT_PAR_SPACE   (TTUF_PAR_SPACE << TTUF_V_PAR)
# define TT_PAR_MARK    (TTUF_PAR_MARK  << TTUF_V_PAR)
# define TT_PAR_EVEN    (TTUF_PAR_EVEN  << TTUF_V_PAR)
# define TT_PAR_ODD     (TTUF_PAR_ODD   << TTUF_V_PAR)
/* TT_GET_MODE returns both the TT_MODE and TT_PAR fields
   since they together are passed into sim_tt_inpcvt() */
# define TT_GET_MODE(x) (((x) >> TTUF_V_MODE) & (TTUF_M_MODE | (TTUF_M_PAR << TTUF_W_MODE)))

t_stat sim_set_console (int32 flag, CONST char *cptr);
t_stat sim_set_remote_console (int32 flag, CONST char *cptr);
void sim_remote_process_command (void);
t_stat sim_set_kmap (int32 flag, CONST char *cptr);
t_stat sim_set_telnet (int32 flag, CONST char *cptr);
t_stat sim_set_notelnet (int32 flag, CONST char *cptr);
t_stat sim_set_serial (int32 flag, CONST char *cptr);
t_stat sim_set_noserial (int32 flag, CONST char *cptr);
t_stat sim_set_logon (int32 flag, CONST char *cptr);
t_stat sim_set_logoff (int32 flag, CONST char *cptr);
t_stat sim_set_debon (int32 flag, CONST char *cptr);
t_stat sim_set_cons_buff (int32 flg, CONST char *cptr);
t_stat sim_set_cons_unbuff (int32 flg, CONST char *cptr);
t_stat sim_set_cons_log (int32 flg, CONST char *cptr);
t_stat sim_set_cons_nolog (int32 flg, CONST char *cptr);
t_stat sim_set_deboff (int32 flag, CONST char *cptr);
t_stat sim_set_cons_expect (int32 flg, CONST char *cptr);
t_stat sim_set_cons_noexpect (int32 flg, CONST char *cptr);
t_stat sim_debug_flush (void);
t_stat sim_set_pchar (int32 flag, CONST char *cptr);
t_stat sim_set_cons_speed (int32 flag, CONST char *cptr);
t_stat sim_show_console (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
t_stat sim_show_remote_console (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
t_stat sim_show_kmap (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
t_stat sim_show_telnet (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
t_stat sim_show_log (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
t_stat sim_show_debug (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
t_stat sim_show_pchar (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
t_stat sim_show_cons_speed (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
t_stat sim_show_cons_buff (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
t_stat sim_show_cons_log (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
t_stat sim_show_cons_expect (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
t_stat sim_check_console (int32 sec);
t_stat sim_open_logfile (const char *filename, t_bool binary, FILE **pf, FILEREF **pref);
t_stat sim_close_logfile (FILEREF **pref);
const char *sim_logfile_name (const FILE *st, FILEREF *ref);
SEND *sim_cons_get_send (void);
EXPECT *sim_cons_get_expect (void);
t_stat sim_show_cons_send_input (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
t_stat sim_poll_kbd (void);
t_stat sim_putchar (int32 c);
t_stat sim_ttinit (void);
t_stat sim_ttrun (void);
t_stat sim_ttcmd (void);
t_stat sim_ttclose (void);
t_bool sim_ttisatty (void);
int32 sim_tt_inpcvt (int32 c, uint32 mode);
int32 sim_tt_outcvt (int32 c, uint32 mode);

extern int32 sim_rem_cmd_active_line;                       /* command in progress on line # */

extern int32 sim_int_char;                                  /* interrupt character */
extern int32 sim_brk_char;                                  /* break character */
extern int32 sim_tt_pchar;                                  /* printable character mask */
extern int32 sim_del_char;                                  /* delete character */

#endif
