252 lines
3.9 KiB
C
252 lines
3.9 KiB
C
|
/**
|
|||
|
* @file conio.h
|
|||
|
* @brief Console I/O.
|
|||
|
* @author Miguel I. Garcia Lopez / FloppySoftware
|
|||
|
*
|
|||
|
* Console I/O functions, for MESCC (Mike's Enhanced
|
|||
|
* Small C Compiler for Z80 & CP/M).
|
|||
|
*
|
|||
|
* Supports following #defines:
|
|||
|
* - CC_STDIO Support for stdin, stdout & stderr.
|
|||
|
* - CC_CONIO_BIOS Support for direct console I/O.
|
|||
|
*
|
|||
|
* Revisions:
|
|||
|
* - 22 Jan 2001 : Last revision.
|
|||
|
* - 16 Apr 2007 : GPL'd.
|
|||
|
* - 21 Apr 2007 : Changed puts for ANSI compatibility.
|
|||
|
* - 15 May 2007 : Bug solved - added LF output to puts.
|
|||
|
* - 13 Jul 2014 : Added kbhit().
|
|||
|
* - 08 Dec 2014 : Added support for stdin, stdout & stderr.
|
|||
|
* - 31 Dec 2014 : Solved bug in putstr when characters are > 0x7F.
|
|||
|
* - 20 Dec 2015 : Added macro CC_CONIO_BIOS to support direct console I/O using BIOS, instead of BDOS.
|
|||
|
* - 08 Jan 2015 : Modified getch() when access BDOS (fn. 6 instead of 1).
|
|||
|
* - 10 Dec 2016 : Documented. GPL v3.
|
|||
|
*
|
|||
|
* Copyright (c) 1999-2016 Miguel I. Garcia Lopez / FloppySoftware.
|
|||
|
*
|
|||
|
* Licensed under the GNU General Public License v3.
|
|||
|
*
|
|||
|
* http://www.floppysoftware.es
|
|||
|
* floppysoftware@gmail.com
|
|||
|
*/
|
|||
|
#ifndef CONIO_H
|
|||
|
|
|||
|
#define CONIO_H
|
|||
|
|
|||
|
/**
|
|||
|
* @fn int putch(int ch)
|
|||
|
* @brief Send character to the console.
|
|||
|
* @param ch - character
|
|||
|
* @return ch
|
|||
|
*/
|
|||
|
#ifdef CC_CONIO_BIOS
|
|||
|
#asm
|
|||
|
|
|||
|
putch
|
|||
|
PUSH HL
|
|||
|
LD C,L
|
|||
|
LD E,9
|
|||
|
CALL xbios
|
|||
|
POP HL
|
|||
|
RET
|
|||
|
|
|||
|
xbios
|
|||
|
LD HL,(1)
|
|||
|
LD D,0
|
|||
|
ADD HL,DE
|
|||
|
JP (HL)
|
|||
|
|
|||
|
#endasm
|
|||
|
#else
|
|||
|
#asm
|
|||
|
|
|||
|
putch
|
|||
|
PUSH HL
|
|||
|
LD C,2
|
|||
|
LD E,L
|
|||
|
CALL 5
|
|||
|
POP HL
|
|||
|
RET
|
|||
|
#endasm
|
|||
|
#endif
|
|||
|
|
|||
|
/**
|
|||
|
* @fn int getch(void)
|
|||
|
* @brief Get character from the console without echo.
|
|||
|
*
|
|||
|
* Waits until a character is available.
|
|||
|
*
|
|||
|
* @return character
|
|||
|
*/
|
|||
|
#ifdef CC_CONIO_BIOS
|
|||
|
#asm
|
|||
|
|
|||
|
getch
|
|||
|
LD E,6
|
|||
|
CALL xbios
|
|||
|
LD H,0
|
|||
|
LD L,A
|
|||
|
RET
|
|||
|
|
|||
|
#endasm
|
|||
|
#else
|
|||
|
#asm
|
|||
|
|
|||
|
getch
|
|||
|
LD C,6
|
|||
|
LD E,255
|
|||
|
CALL 5
|
|||
|
OR A
|
|||
|
JR Z,getch
|
|||
|
LD H,0
|
|||
|
LD L,A
|
|||
|
RET
|
|||
|
#endasm
|
|||
|
#endif
|
|||
|
|
|||
|
/**
|
|||
|
* @fn int kbhit(void)
|
|||
|
* @brief Tests console input status.
|
|||
|
* @return != 0 if a character is available, else 0.
|
|||
|
*/
|
|||
|
#ifdef CC_CONIO_BIOS
|
|||
|
#asm
|
|||
|
|
|||
|
kbhit
|
|||
|
LD E, 3
|
|||
|
CALL xbios
|
|||
|
LD H,A
|
|||
|
LD L,A
|
|||
|
RET
|
|||
|
|
|||
|
#endasm
|
|||
|
#else
|
|||
|
#asm
|
|||
|
|
|||
|
kbhit
|
|||
|
LD C,11
|
|||
|
CALL 5
|
|||
|
LD H,A
|
|||
|
LD L,A
|
|||
|
RET
|
|||
|
#endasm
|
|||
|
#endif
|
|||
|
|
|||
|
/**
|
|||
|
* @fn int getchar(void)
|
|||
|
* @brief Get character from the console or stdin.
|
|||
|
*
|
|||
|
* Waits until a character is available.
|
|||
|
*
|
|||
|
* #ifdef CC_STDIO: Returns a character from stdin, or EOF on end of file or error.
|
|||
|
* #ifndef CC_STDIO: Returns a character from the console. Echoes the character.
|
|||
|
*
|
|||
|
* @return character on success, else EOF.
|
|||
|
*/
|
|||
|
getchar()
|
|||
|
{
|
|||
|
|
|||
|
#ifdef CC_STDIO
|
|||
|
|
|||
|
return fgetc(stdin);
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
return putchar(getch());
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @fn int putchar(int ch)
|
|||
|
* @brief Send character to the console or stdout.
|
|||
|
*
|
|||
|
* #ifdef CC_STDIO: Returns ch, or EOF on error.
|
|||
|
* #ifndef CC_STDIO: Returns ch.
|
|||
|
*
|
|||
|
* @param ch - character
|
|||
|
* @return ch on success, else EOF.
|
|||
|
*/
|
|||
|
putchar(ch)
|
|||
|
int ch;
|
|||
|
{
|
|||
|
|
|||
|
#ifdef CC_STDIO
|
|||
|
|
|||
|
return fputc(ch, stdout);
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
if(ch == '\n')
|
|||
|
putch('\r');
|
|||
|
|
|||
|
return putch(ch);
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @fn int putstr(char *s)
|
|||
|
* @brief Send string to the console or stdout.
|
|||
|
*
|
|||
|
* #ifdef CC_STDIO: Returns the number of characters sent, or EOF on error.
|
|||
|
* #ifndef CC_STDIO: Returns a non-negative value to indicate success.
|
|||
|
*
|
|||
|
* @param s - string
|
|||
|
* @return number of characters sent on success, else EOF.
|
|||
|
*/
|
|||
|
putstr(s)
|
|||
|
char *s;
|
|||
|
{
|
|||
|
|
|||
|
#ifdef CC_STDIO
|
|||
|
|
|||
|
/* FIXME : Better if call to fputs (if available) */
|
|||
|
|
|||
|
int i, c;
|
|||
|
|
|||
|
i = 0;
|
|||
|
|
|||
|
while(*s)
|
|||
|
{
|
|||
|
/* FIXME : -1 hardcoded -- < 0 causes strange
|
|||
|
behaviour if ch > 0x7F */
|
|||
|
|
|||
|
if((c = putchar(*s++)) == -1)
|
|||
|
return c;
|
|||
|
++i;
|
|||
|
}
|
|||
|
|
|||
|
return i;
|
|||
|
#else
|
|||
|
while(*s)
|
|||
|
putchar(*s++);
|
|||
|
|
|||
|
return 0;
|
|||
|
#endif
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @fn int puts(char *s)
|
|||
|
* @brief Send string + '\n' to the console or stdout.
|
|||
|
*
|
|||
|
* #ifdef CC_STDIO: Returns the number of characters sent, or EOF on error.
|
|||
|
* #ifndef CC_STDIO: Returns a non-negative value to indicate success.
|
|||
|
*
|
|||
|
* @param s - string
|
|||
|
* @return number of characters sent on success, else EOF.
|
|||
|
*/
|
|||
|
puts(s)
|
|||
|
char *s;
|
|||
|
{
|
|||
|
putstr(s);
|
|||
|
|
|||
|
return putchar('\n'); /* FIXME */
|
|||
|
}
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|