0x00 constant SDxL_SCxL 0x01 constant SDxL_SCxH 0x02 constant SDxH_SCxL 0x03 constant SDxH_SCxH 0x378 constant PRN_Data \ code pc! ( ¸ê®Æ I/O_Port#number --- ) \ pop eax \ push dx \ mov dx, bx \ out dx, al \ pop dx \ pop ebx \ next \ c; \ code pc@ ( I/O_Port#number --- ¸ê®Æ ) \ mov ax, bx \ push dx \ mov dx, ax \ in al, dx \ pop dx \ mov ebx, eax \ and ebx, # 0xff \ next \ c; : IICdoit! PRN_Data PC! ; : IICdoit@ PRN_Data PC@ ; : delay_4us 50 0 do 1 1 + drop loop ; : StartIIC ( --- ) SDxH_SCxH IICdoit! \ SD=High ; SC=High delay_4us SDxL_SCxH IICdoit! \ SD=Low ; SC=High delay_4us SDxL_SCxL IICdoit! \ SD=Low ; SC=Low delay_4us ; : StopIIC SDxL_SCxL IICdoit! \ SD=Low ; SC=Low delay_4us SDxL_SCxH IICdoit! \ SD=Low ; SC=High delay_4us SDxH_SCxH IICdoit! \ SD=High ; SC=High delay_4us ; : ACKslave? SDxH_SCxH IICdoit! \ SD=High ; SC=High \ IICdoit@ 0x02 and 0 = if \ ." it has ACK! " cr \ else \ ." it has't ACK! " cr \ then delay_4us SDxH_SCxL IICdoit! \ SD=High ; SC=Low delay_4us SDxL_SCxL IICdoit! \ SD=Low ; SC=Low delay_4us ; : DataTransferIIC ( Data --- ) 8 0 do dup 0x80 and 0= if SDxL_SCxL IICdoit! delay_4us SDxL_SCxH IICdoit! else SDxH_SCxL IICdoit! delay_4us SDxH_SCxH IICdoit! then 1 lshift delay_4us loop drop SDxL_SCxL IICdoit! \ SD=High ; SC=Low delay_4us ACKslave? ; : demo 600 0 do cls 50 i * 14725 + 3800 + 100 * 625 / cr hex .s decimal cr dup 0xff and swap 0xff00 and 8 rshift hex .s decimal StartIIC 0xc2 DataTransferIIC DataTransferIIC DataTransferIIC 0x86 DataTransferIIC 0x02 DataTransferIIC StopIIC ." i= " i . cr key drop loop ;