I > O関数の追加

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

sdccはinp(),outp()関数が無い。Z80用に関数を作成し追加する。
汎用性があるので他のZ80互換ハード用としても利用可能。

iolib.asm
;---------------
;sdcc Z80 I/O function
;---------------
	.area	_CODE
;
; ret=inp(port addr)
;
_inp::
	ld	hl,#2
	add	hl,sp
;
	ld	c,(hl)
	in	a,(c)
;
	ld	l,a
	ld	h,#0
;
	ret
;
; outp(port addr,param)
;
_outp::
	push bc
	ld	hl,#4
	add	hl,sp
;
	ld	c,(hl)
	inc	hl
	ld	b,(hl)
	out	(c),b
;
	pop 	bc
	ret


アセンブルしてオブジェクトファイルを作成。

> sdasz80 -o iolib.rel iolib.asm

別途ライブラリアンで自作ライブラリを作成するのも良し、オブジェクトファイルを
そのままCソースとリンクするのも良し。

ライブラリを作成する場合の例↓

> sdcclib portio.lib iolib.rel


  • C言語とのリンク

C言語のinp(),outp()使用例を示す。
この例ではポート入出力を行う。関数は以下の引数を持つ。

return = inp(I/O addr)
outp(I/O addr,Param)


iotest.c
#include <stdio.h>

extern unsigned char inp(unsigned char);
extern outp(unsigned char,unsigned char);

void main(void){
	unsigned char rtn;

	rtn=inp(0x98);
	putchar(rtn);

	outp(0x98,0x7f);
}


コンパイル方法↓。

> sdcc -mz80 -c iotest.c
> sdld -b _CODE=0x100 -b _DATA=0x100 -i out.ihx iotest.rel -l portio.lib
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。