; I2C ROUTINES
;
; Written by Marco Maccaferri
; https://www.maccasoft.com
;
; Achtung Board SC137 io geaendert
; vorher 020h jetzt 0Ch
; _io=0CH, _sda=7,scl=0,_idle=10000001B 
;
P8X180	equ	0
SC126	equ	0
SC137	equ	1

	COND P8X180
_io	equ	0A0h
_sda	equ	0
_scl	equ	1
_idle	equ	00000011B
	ENDC
	COND SC126
_io	equ	0Ch
_sda	equ	7
_scl	equ	0
_idle	equ	10001101B
	ENDC
	COND SC137
_io	equ	0Ch
_sda	equ	7
_scl	equ	0
_idle	equ	10000001B
	ENDC

	psect	text
	global	_i2c_start, _i2c_stop
	global	_i2c_write, _i2c_read
	global	_delay

_i2c_start:
	ld	a,_idle
	out	(_io),a

	res	_sda,a
	out	(_io),a
	nop
	nop
	res	_scl,a
	out	(_io),a

	ld	(oprval),a
	ret

_i2c_stop:
	ld	a,(oprval)
	res	_scl,a
	res	_sda,a
	out	(_io),a

	set	_scl,a
	out	(_io),a
	nop
	nop
	set	_sda,a
	out	(_io),a

	ld	(oprval),a
	ret

_i2c_write:
	push	ix
	ld	ix,4
	add	ix,sp

	ld	c,(ix+0)
	ld	a,(oprval)

	ld	b,8
1:	res	_sda,a
	rl	c
	jr	nc,2f
	set	_sda,a
2:	out	(_io),a
	set	_scl,a
	out	(_io),a

	COND SC126=0
	ld	d,a
3:	in	a,(_io)
	bit	_scl,a
	jr	z,3b
	ld	a,d
	ENDC

	res	_scl,a
	out	(_io),a
	djnz	1b

	set	_sda,a
	out	(_io),a
	set	_scl,a
	out	(_io),a

	ld	d,a
4:	in	a,(_io)
	COND SC126=0
	bit	_scl,a
	jr	z,4b
	ENDC
	ld	c,a
	ld	a,d

	res	_scl,a
	out	(_io),a
	ld	(oprval),a
	
	pop	ix

	ld	hl,0
	bit	_sda,c
	ret	z
	inc	l

	ret

_i2c_read:
	push	ix
	ld	ix,4
	add	ix,sp

	ld	a,(oprval)
	set	_sda,a
	out	(_io),a
	
	ld	hl,0
	ld	b,8
1:	sla	l
	ld	c,a
	set	_scl,a
	out	(_io),a
2:	in	a,(_io)
	COND SC126=0
	bit	_scl,a
	jr	z,2b
	ENDC
	bit	_sda,a
	jr	z,3f
	set	0,l
3:	ld	a,c
	out	(_io),a
	djnz	1b

	res	_sda,a
	bit	0,(ix+0)
	jr	z,4f
	set	_sda,a
4:	out	(_io),a
	set	_scl,a
	out	(_io),a
	COND SC126=0
	ld	c,a
5:	in	a,(_io)
	bit	_scl,a
	jr	z,5b
	ld	a,c
	ENDC

	res	_scl,a
	out	(_io),a
	set	_sda,a
	out	(_io),a
	
	ld	(oprval),a

	pop	ix
	ret

	psect data

oprval:	defb	0
