一般処理ライブラリー関係サンプル
/*======================================================================*/
/* */
/* 一般処理ライブラリー Vr1.01 */
/* */
/* stdlib.h Y.Fushimi 97/02/10 */
/* */
/* void wait_100( ) */
/* void wait_1m( ) */
/* void wait_05s( ) */
/* char *bin_to_hex(int bin) 割込みプログラムには使用不可 */
/* char *bin_to_dec(int bin) 割込みプログラムには使用不可 */
/* int hex_to_bin(char *str) */
/* int dec_to_bin(char *str) */
/* */
/*======================================================================*/
#asm
WAIT_ORIG:
PUSH BC ;4MHzの場合200μs
;6MHzの場合150μs
LD B,55 ;8MHzの場合100μs
WAIT_ORIG_1:
DJNZ WAIT_ORIG_1
POP BC
RET
HEX_UPPER:
AND 0F0H
PUSH AF
ADD A,60H
JR C,HEX_UPPER_1
POP AF
SRL A
SRL A
SRL A
SRL A
OR 30H
RET
HEX_UPPER_1:
POP AF
SRL A
SRL A
SRL A
SRL A
ADD A,37H
RET
HEX_LOWER:
AND 0FH
PUSH AF
ADD A,0F6H
JR C,HEX_LOWER_1
POP AF
OR 30H
RET
HEX_LOWER_1:
POP AF
ADD A,37H
RET
BIN_TO_BCD:
PUSH AF
PUSH BC
PUSH IX ;ここまではレジスター保護
PUSH BC ;変数"bcd[ 3 ]"
DEC SP
LD A,0
LD HL,0
ADD HL,SP
INC HL
LD (HL),A
INC HL
LD (HL),A
LD HL,11
ADD HL,SP
LD A,(HL)
AND 0FH
ADD A,0F6H
JR NC,BIN_TO_BCD_01
OR 10H
JR BIN_TO_BCD_02
BIN_TO_BCD_01:
LD A,(HL)
AND 0FH
BIN_TO_BCD_02:
LD HL,0
ADD HL,SP
LD (HL),A
LD IX,ADD_DATA
LD B,10H
LD C,4
BIN_TO_BCD_03:
LD HL,11
ADD HL,SP
LD A,(HL)
AND B
JR Z,BIN_TO_BCD_05
LD HL,0
ADD HL,SP
LD A,(HL)
ADD A,(IX+0)
DAA
LD (HL),A
JR NC,BIN_TO_BCD_04
INC HL
LD A,(HL)
ADD A,01H
DAA
LD (HL),A
BIN_TO_BCD_04:
INC IX
LD HL,1
ADD HL,SP
LD A,(HL)
ADD A,(IX+0)
DAA
LD (HL),A
JR BIN_TO_BCD_06
BIN_TO_BCD_05:
INC IX
BIN_TO_BCD_06:
INC IX
RLC B
DEC C
JR NZ,BIN_TO_BCD_03
LD C,6
BIN_TO_BCD_07:
LD HL,12
ADD HL,SP
LD A,(HL)
AND B
JR Z,BIN_TO_BCD_09
LD HL,0
ADD HL,SP
LD A,(HL)
ADD A,(IX+0)
DAA
LD (HL),A
JR NC,BIN_TO_BCD_08
INC HL
LD A,(HL)
ADD A,01H
DAA
LD (HL),A
JR NC,BIN_TO_BCD_08
INC HL
LD A,(HL)
ADD A,01H
DAA
LD (HL),A
BIN_TO_BCD_08:
INC IX
LD HL,1
ADD HL,SP
LD A,(HL)
ADD A,(IX+0)
DAA
LD (HL),A
JR NC,BIN_TO_BCD_10
INC HL
LD A,(HL)
ADD A,01H
DAA
LD (HL),A
JR BIN_TO_BCD_10
BIN_TO_BCD_09:
INC IX
BIN_TO_BCD_10:
INC IX
RLC B
DEC C
JR NZ,BIN_TO_BCD_07
LD C,2
BIN_TO_BCD_11:
LD HL,12
ADD HL,SP
LD A,(HL)
AND B
JR Z,BIN_TO_BCD_14
LD HL,0
ADD HL,SP
LD A,(HL)
ADD A,(IX+0)
DAA
LD (HL),A
JR NC,BIN_TO_BCD_12
INC HL
LD A,(HL)
ADD A,01H
DAA
LD (HL),A
JR NC,BIN_TO_BCD_12
INC HL
LD A,(HL)
ADD A,01H
DAA
LD (HL),A
BIN_TO_BCD_12:
INC IX
LD HL,1
ADD HL,SP
LD A,(HL)
ADD A,(IX+0)
DAA
LD (HL),A
JR NC,BIN_TO_BCD_13
INC HL
LD A,(HL)
ADD A,01H
DAA
LD (HL),A
BIN_TO_BCD_13:
INC IX
LD HL,2
ADD HL,SP
LD A,(HL)
ADD A,(IX+0)
DAA
LD (HL),A
JR BIN_TO_BCD_15
BIN_TO_BCD_14:
INC IX
INC IX
BIN_TO_BCD_15:
INC IX
RLC B
DEC C
JR NZ,BIN_TO_BCD_11
LD HL,0 ;"bcd[ 3 ]"のアドレスを"HL"に
ADD HL,SP
INC SP
POP BC
POP IX
POP BC
POP AF
RET
ADD_DATA:
DB 16H,0,32H,0,64H,0,28H,01H,56H,02H,12H,05H,24H,10H
ADD_DATA_1:
DB 48H,20H,96H,40H,92H,81H,84H,63H,01H,68H,27H,03H
#endasm
void wait_100( )
{
#asm
call wait_orig
#endasm
}
void wait_1m( )
{
#asm
ld b,10
wait_1m_1:
call wait_orig
djnz wait_1m_1
#endasm
}
void wait_05s( )
{
#asm
ld l,0fah
wait_05s_1:
push hl
call __wait_1m
pop hl
dec l
jr nz,wait_05s_1
ld l,0fah
wait_05s_2:
push hl
call __wait_1m
pop hl
dec l
jr nz,wait_05s_2
#endasm
}
char *bin_to_hex(int bin)
{
#asm
push bc
push bc
dec sp
ld hl,4
add hl,sp
ld (hl),0
ld hl,8
add hl,sp
ld a,(hl)
call hex_upper
ld hl,3
add hl,sp
ld (hl),a
ld hl,8
add hl,sp
ld a,(hl)
call hex_lower
ld hl,2
add hl,sp
ld (hl),a
ld hl,7
add hl,sp
ld a,(hl)
call hex_upper
ld hl,1
add hl,sp
ld (hl),a
ld hl,7
add hl,sp
ld a,(hl)
call hex_lower
ld hl,0
add hl,sp
ld (hl),a
inc sp
pop bc
pop bc
#endasm
}
char *bin_to_dec(int bin)
{
#asm
ld hl,2
add hl,sp
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
push hl
call bin_to_bcd
pop bc
push hl ;bcd[ 3 ]のアドレス
push bc
push bc
push bc ;dec[ 6 ]
ld hl,6
add hl,sp
ld e,(hl)
inc hl
ld d,(hl)
inc de
inc de
ld hl,5
add hl,sp
ld (hl),0
ld c,0
ld b,2
jr bin_to_dec_3
bin_to_dec_1:
dec b
ld a,(de)
and 0f0h
jr nz,bin_to_dec_2
ld a,c
or a
jr nz,bin_to_dec_2
ld a,20h
ld (hl),a
jr bin_to_dec_3
bin_to_dec_2:
ld a,(de)
and 0f0h
rrca
rrca
rrca
rrca
or 30h
ld (hl),a
ld c,1
bin_to_dec_3:
dec hl
ld a,(de)
and 0fh
jr nz,bin_to_dec_4
ld a,c
or a
jr nz,bin_to_dec_4
ld a,b
or a
jr z,bin_to_dec_4
ld a,20h
ld (hl),a
jr bin_to_dec_5
bin_to_dec_4:
ld a,(de)
and 0fh
or 30h
ld (hl),a
ld c,1
bin_to_dec_5:
dec de
dec hl
ld a,b
or a
jr nz,bin_to_dec_1
ld hl,0
add hl,sp
pop bc
pop bc
pop bc
pop bc
#endasm
}
int dec_to_bin(char *str)
{
#asm
LD HL,2
ADD HL,SP
LD E,(HL) ;下位アドレスを取得
INC HL
LD D,(HL) ;上位アドレスを取得
LD B,0
DEC_TO_BIN_01: INC DE ;NULLまでアドレスUP
INC B
LD A,5 ;最大5桁まで
SUB B
JR Z,DEC_TO_BIN_02
LD A,(DE)
OR A
JR NZ,DEC_TO_BIN_01
DEC_TO_BIN_02: DEC DE ;一の桁を変換
DEC B
LD H,0
LD A,(DE)
AND 0FH
LD L,A
LD A,B
OR A
JR Z,DEC_TO_BIN_10 ;終了
;
DEC DE ;十の桁を変換
DEC B
PUSH DE
LD A,(DE)
AND 0FH
JR Z,DEC_TO_BIN_04
LD DE,10
DEC_TO_BIN_03: ADD HL,DE
DEC A
JR NZ,DEC_TO_BIN_03
DEC_TO_BIN_04: POP DE
LD A,B
OR A
JR Z,DEC_TO_BIN_10 ;終了
;
DEC DE ;百の桁を変換
DEC B
PUSH DE
LD A,(DE)
AND 0FH
JR Z,DEC_TO_BIN_06
LD DE,100
DEC_TO_BIN_05: ADD HL,DE
DEC A
JR NZ,DEC_TO_BIN_05
DEC_TO_BIN_06: POP DE
LD A,B
OR A
JR Z,DEC_TO_BIN_10 ;終了
;
DEC DE ;千の桁を変換
DEC B
PUSH DE
LD A,(DE)
AND 0FH
JR Z,DEC_TO_BIN_08
LD DE,1000
DEC_TO_BIN_07: ADD HL,DE
DEC A
JR NZ,DEC_TO_BIN_07
DEC_TO_BIN_08: POP DE
LD A,B
OR A
JR Z,DEC_TO_BIN_10 ;終了
;
DEC DE ;万の桁を変換
DEC B
LD A,(DE)
AND 0FH
JR Z,DEC_TO_BIN_10 ;終了
LD DE,10000
DEC_TO_BIN_09: ADD HL,DE
DEC A
JR NZ,DEC_TO_BIN_09
DEC_TO_BIN_10: RET
#endasm
}
int hex_to_bin(char *str)
{
#asm
LD HL,2
ADD HL,SP
LD E,(HL) ;下位アドレスを取得
INC HL
LD D,(HL) ;上位アドレスを取得
LD B,0
HEX_TO_BIN_01: INC DE ;NULLまでアドレスUP
INC B
LD A,4 ;最大4桁まで
SUB B
JR Z,HEX_TO_BIN_02
LD A,(DE)
OR A
JR NZ,HEX_TO_BIN_01
;
HEX_TO_BIN_02: DEC DE ;1桁目処理
DEC B
LD H,0
LD A,(DE)
LD C,A
LD A,3FH
SUB C
JR C,HEX_TO_BIN_03
LD A,C ;0〜9まで
AND 0FH
LD L,A
JR HEX_TO_BIN_04
HEX_TO_BIN_03: LD A,C ;A〜Fまで
AND 0FH
ADD A,9
LD L,A
;
HEX_TO_BIN_04: LD A,B ;2桁目の処理
OR A
JR Z,HEX_TO_BIN_10 ;終了
DEC DE
DEC B
LD A,(DE)
LD C,A
LD A,3FH
SUB C
JR C,HEX_TO_BIN_05
LD A,C ;1〜9まで
AND 0FH
SLA A
SLA A
SLA A
SLA A
OR L
LD L,A
JR HEX_TO_BIN_06
HEX_TO_BIN_05: LD A,C ;A〜Fまで
AND 0FH
ADD A,9
SLA A
SLA A
SLA A
SLA A
OR L
LD L,A
;
HEX_TO_BIN_06: LD A,B ;3桁目の処理
OR A
JR Z,HEX_TO_BIN_10 ;終了
DEC DE
DEC B
LD A,(DE)
LD C,A
LD A,3FH
SUB C
JR C,HEX_TO_BIN_07
LD A,C ;1〜9まで
AND 0FH
LD H,A
JR HEX_TO_BIN_08
HEX_TO_BIN_07: LD A,C ;A〜Fまで
AND 0FH
ADD A,9
LD H,A
;
HEX_TO_BIN_08: LD A,B ;4桁目の処理
OR A
JR Z,HEX_TO_BIN_10 ;終了
DEC DE
DEC B
LD A,(DE)
LD C,A
LD A,3FH
SUB C
JR C,HEX_TO_BIN_09
LD A,C ;1〜9まで
AND 0FH
SLA A
SLA A
SLA A
SLA A
OR H
LD H,A
JR HEX_TO_BIN_10
HEX_TO_BIN_09: LD A,C ;A〜Fまで
AND 0FH
ADD A,9
SLA A
SLA A
SLA A
SLA A
OR H
LD H,A
;
HEX_TO_BIN_10: RET
#endasm
}