32c881474e
Made this work with cpm (but nothing else yet).
54 lines
1.1 KiB
C
54 lines
1.1 KiB
C
/* $Source$
|
|
* $State$
|
|
* $Revision$
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <errno.h>
|
|
#include <unistd.h>
|
|
#include <cpm.h>
|
|
|
|
ssize_t read(int fd, void* buffer, size_t count)
|
|
{
|
|
short save;
|
|
unsigned char before_n;
|
|
|
|
/* We're only allowed to read from fd 0, 1 or 2. */
|
|
if ((fd < 0) || (fd > 2))
|
|
{
|
|
errno = EBADF;
|
|
return -1;
|
|
}
|
|
|
|
/* We need room for at least 1 char plus '\n'. */
|
|
if (count < 2)
|
|
{
|
|
errno = EINVAL;
|
|
return -1;
|
|
}
|
|
|
|
/* Make room to append '\n' later. */
|
|
before_n = count > 255 ? 255 : count - 1;
|
|
|
|
/* Borrow 2 bytes of RAM before the buffer. */
|
|
/* This might overwrite count!!! */
|
|
save = ((short*)buffer)[-1];
|
|
|
|
/* Read one line from the console. */
|
|
((unsigned char*)buffer)[-2] = before_n;
|
|
cpm_bc_register = CPM_BDOS_READ_CONSOLE_BUFFER;
|
|
cpm_de_register = (uint16_t)(char*)buffer - 2;
|
|
cpm_bdos();
|
|
before_n = ((unsigned char*)buffer)[-1];
|
|
|
|
((char*)buffer)[before_n] = '\n'; /* Append '\n'. */
|
|
((short*)buffer)[-1] = save; /* Give back borrowed bytes. */
|
|
|
|
/* Echo '\n' to console. */
|
|
cpm_bc_register = CPM_BDOS_PRINT_STRING;
|
|
cpm_de_register = (uint16_t)"\r\n$";
|
|
cpm_bdos();
|
|
|
|
return (int)before_n + 1;
|
|
}
|