「I/O関数の追加」の編集履歴(バックアップ)一覧はこちら
「I/O関数の追加」(2012/01/27 (金) 20:33:15) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
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