シリアルインターフェイス関係サンプル
CTC_1_INIT: PUSH AF LD A,00010111B OUT (IO_CTC_C1),A POP AF OUT (IO_CTC_C1),A RET CTC_2_INIT: PUSH AF LD A,00010111B OUT (IO_CTC_C2),A POP AF OUT (IO_CTC_C2),A RET続いて、各関数の説明を書いておきます。
| 記入例 | 通信速度 |
|---|---|
| SP_9600 | 9600BPS |
| SP_4800 | 4800BPS |
| SP_2400 | 2400BPS |
| SP_1200 | 1200BPS |
| SP_300 | 300BPS |
| 記入例 | データビット |
|---|---|
| DT_8 | 8bit |
| DT_7 | 7bit |
| 記入例 | ストップビット |
|---|---|
| ST_1 | 1bit |
| ST_15 | 1.5bit |
| ST_2 | 2bit |
| 記入例 | パリテイビット |
|---|---|
| PR_N | 無し |
| PR_O | 奇数 |
| PR_E | 偶数 |
| ビット | highの意味 |
|---|---|
| bit"0" | パリテーerr |
| bit"1" | オーバーランerr |
| bit"2" | フレーミングerr |
/*======================================================================*/
/* */
/* "AKI80" 7.37MHZ SIOドライバープログラム */
/* (ポートアドレスは、Z84C015 にあわせてあります。) */
/* ( sio_a == ctc_2 sio_b == ctc_1 ) */
/* */
/* sio_drv.h Vr1.00 96/07/10 */
/* */
/* void sio_a_init(int sped,int datbit,int stpbit,int parit) */
/* void sio_b_init(int sped,int datbit,int stpbit,int parit) */
/* ("sio_a_init(SP_9600,DT_8,ST_1,PR_N)") */
/* void sio_a_reset( ) */
/* void sio_b_reset( ) */
/* int sio_a_rx_check( ) */
/* int sio_b_rx_check( ) */
/* ("0" 受信データ無し "1" 受信データ有り) */
/* int sio_a_getchar( ) */
/* int sio_b_getchar( ) */
/* int sio_a_putchar(char data) */
/* int sio_b_putchar(char data) */
/* ("0" 送信不可 "1" 送信済み) */
/* int sio_a_geterr( ) */
/* int sio_b_geterr( ) */
/* ( bit"0"=パリテーerr bit"1"=オーバーランerr bit"2"=フレーミングerr ) */
/* void sio_a_erreset( ) */
/* void sio_b_erreset( ) */
/* */
/*======================================================================*/
#define SP_300 96 // SIO 300Bps
#define SP_1200 24 // SIO 1200Bps
#define SP_2400 12 // SIO 2400Bps
#define SP_4800 6 // SIO 4800Bps
#define SP_9600 3 // SIO 9600Bps
#define DT_7 0x81 // SIO Data 7bit
#define DT_8 0xc1 // SIO Data 8bit
#define ST_1 0x74 // SIO Stop Bit 1bit
#define ST_15 0x78 // SIO Stop Bit 1.5bit
#define ST_2 0x7c // SIO Stop Bit 2bit
#define PR_N 0 // SIO Non Parity
#define PR_O 0x01 // SIO Parity odd
#define PR_E 0x03 // SIO Parity even
#asm
CTC_1_INIT:
PUSH AF
LD A,00010111B
OUT (IO_CTC_C1),A
POP AF
OUT (IO_CTC_C1),A
RET
CTC_2_INIT:
PUSH AF
LD A,00010111B
OUT (IO_CTC_C2),A
POP AF
OUT (IO_CTC_C2),A
RET
#endasm
void sio_a_init(int sped,int datbit,int stpbit,int parit)
{
#asm
ld hl,8
add hl,sp
ld a,(hl)
call ctc_2_init
ld a,00011000b
out (io_sio_ac),a ;SIOリセット
ld a,4
out (io_sio_ac),a
ld hl,4
add hl,sp
ld a,(hl)
ld hl,2
add hl,sp
ld h,(hl)
or h
out (io_sio_ac),a ;WR4設定
ld a,1
out (io_sio_ac),a
ld a,00h
out (io_sio_ac),a ;WR1設定
ld a,3
out (io_sio_ac),a
ld hl,6
add hl,sp
ld a,(hl)
ld h,a
out (io_sio_ac),a ;WR3設定
ld a,5
out (io_sio_ac),a
ld a,h
srl a
or 10001010b ;RTS,DTR ON
out (io_sio_ac),a ;WR5設定
#endasm
}
void sio_b_init(int sped,int datbit,int stpbit,int parit)
{
#asm
ld hl,8
add hl,sp
ld a,(hl)
call ctc_1_init
ld a,00011000b
out (io_sio_bc),a ;SIOリセット
ld a,4
out (io_sio_bc),a
ld hl,4
add hl,sp
ld a,(hl)
ld hl,2
add hl,sp
ld h,(hl)
or h
out (io_sio_bc),a ;WR4設定
ld a,1
out (io_sio_bc),a
ld a,00h
out (io_sio_bc),a ;WR1設定
ld a,3
out (io_sio_bc),a
ld hl,6
add hl,sp
ld a,(hl)
ld h,a
out (io_sio_bc),a ;WR3設定
ld a,5
out (io_sio_bc),a
ld a,h
srl a
or 10001010b ;RTS,DTR ON
out (io_sio_bc),a ;WR5設定
#endasm
}
void sio_a_reset( )
{
#asm
ld a,00011000b
out (io_sio_ac),a ;SIOリセット
#endasm
}
void sio_b_reset( )
{
#asm
ld a,00011000b
out (io_sio_bc),a ;SIOリセット
#endasm
}
int sio_a_rx_check( )
{
#asm
in a,(io_sio_ac)
and 00000001b
jr nz,sio_a_rx_check_1
ld hl,0
ret
sio_a_rx_check_1:
ld hl,1
#endasm
}
int sio_b_rx_check( )
{
#asm
in a,(io_sio_bc)
and 00000001b
jr nz,sio_b_rx_check_1
ld hl,0
ret
sio_b_rx_check_1:
ld hl,1
#endasm
}
int sio_a_getchar( )
{
#asm
in a,(io_sio_ad)
ld l,a
ld h,0
#endasm
}
int sio_b_getchar( )
{
#asm
in a,(io_sio_bd)
ld l,a
ld h,0
#endasm
}
int sio_a_putchar(char data)
{
#asm
in a,(io_sio_ac)
and 00000100b
jr nz,sio_a_tx_check_1
ld hl,0
ret
sio_a_tx_check_1:
ld hl,2
add hl,sp
ld a,(hl)
out (io_sio_ad),a
ld hl,1
#endasm
}
int sio_b_putchar(char data)
{
#asm
in a,(io_sio_bc)
and 00000100b
jr nz,sio_b_tx_check_1
ld hl,0
ret
sio_b_tx_check_1:
ld hl,2
add hl,sp
ld a,(hl)
out (io_sio_bd),a
ld hl,1
#endasm
}
int sio_a_geterr( )
{
#asm
ld a,1
out (io_sio_ac),a
in a,(io_sio_ac)
and 01110000b
srl a
srl a
srl a
srl a
ld l,a
ld h,0
#endasm
}
int sio_b_geterr( )
{
#asm
ld a,1
out (io_sio_bc),a
in a,(io_sio_bc)
and 01110000b
srl a
srl a
srl a
srl a
ld l,a
ld h,0
#endasm
}
void sio_a_erreset( )
{
#asm
ld a,00110000b
out (io_sio_ac),a
#endasm
}
void sio_b_erreset( )
{
#asm
ld a,00110000b
out (io_sio_bc),a
#endasm
}