ライブラリソースから[drive:\sdccdir]\lib\src\gets.cファイルにあるgets()関数のCソースを編集しコンパイルする。
gets()関数はgetchar()を内部で利用する。
修正箇所はputchar()部分を全てコメントアウト。
システムコール0x01番は内部でエコーバックするため、gets()関数内部putchar()による
エコーバック処理は必要無し。
gets.c
#include <stdio.h>
char *
gets (char *s)
{
char c;
unsigned int count = 0;
while (1)
{
c = getchar ();
switch(c)
{
case '\b': /* backspace */
if (count)
{
//putchar ('\b');
//putchar (' ');
//putchar ('\b');
--s;
--count;
}
break;
case '\n':
case '\r': /* CR or LF */
//putchar ('\r');
//putchar ('\n');
*s = 0;
return s;
default:
*s++ = c;
++count;
//putchar (c);
break;
}
}
}
修正後gets.cをコンパイル。
> sdcc -mz80 -c gets.c
修正版gets.cライブラリは↓
本来は標準入出力ライブラリとして他の関数を一つにまとめる。
> sdcclib gets.lib getchar.rel gets.rel
gets()関数のC言語の利用方法を示す。
#include <stdio.h>
void main(void){
char buf[120];
gets(buf);
}
> sdcc -mz80 -c source.c
> sdld -b _CODE=0x100 -b _DATA=0x100 -i out.ihx source.rel getchar.rel gets.rel
I/Oライブラリのgetchar()はアセンブラで実装されこの部分を変更すると異なる機種用が可能。
getchar()はCPM互換のシステムコールを用いるのでMSXDOS他CPM互換マシンで動作する。
最終更新:2012年01月29日 13:06