; version 1.0
read_inputs: mov a,p3
jb polarity_pin,ri_ok
cpl a
ri_ok: mov inputs,a
ret
detect_clock: mov c,clock_pin
anl c,/clock_old
jc dc_yes
mov c,clock_pin
mov clock_old,c
clr a
ret
dc_yes: setb clock_old
mov a,#0ffh
ret
; r0=cnt dptr -> table of bit addresses
pol_byte: mov r2,#0
pb_lp: clr a
movc a,@a+dptr
mov r1,a
swap a
rl a
anl a,#1fh
add a,#pol_table_old
xch a,r1
anl a,#7
call get_rvs_mask
anl a,@r1
clr c
jz pb_shift
setb c
pb_shift: mov a,r2
rlc a
mov r2,a
inc dptr
djnz r0,pb_lp
ret
process_data: mov a,pol_index
jnz pd_get_bit
jnb data_pin,pd_ret
inc pol_index
pd_ret: clr a
ret
pd_get_bit: dec a
mov r0,a
swap a
rl a
anl a,#1fh
add a,#pol_table
xch a,r0
anl a,#7
call get_rvs_mask
jb data_pin,pd_set
cpl a
anl a,@r0
sjmp pd_inc
pd_set: orl a,@r0
pd_inc: mov @r0,a
inc pol_index
mov a,#36+1
cjne a,pol_index,pd_ret
mov pol_index,#0
mov r0,#pol_table
mov r1,#pol_table_old
mov r2,#5
mov b,#0
pd_lp1: mov a,@r0
mov r3,a
xch a,@r1
xrl a,r3
orl b,a
inc r0
inc r1
djnz r2,pd_lp1
mov a,b
jz pd_ret
mov a,#0ffh
ret
find_char: mov r0,a
mov dptr,#symbol_table
fc_lp: clr a
movc a,@a+dptr
jz fc_done
xrl a,r0
jz fc_done
mov a,dpl
add a,#6
mov dpl,a
clr a
addc a,dph
mov dph,a
jmp fc_lp
fc_done: inc dptr
ret
show_data: clr ea
mov r0,#2
mov dptr,#pol_dir
call pol_byte
rrc a
mov going_up_n,c
rrc a
mov going_dn_n,c
mov r0,#8
mov dptr,#pol_ascii0
call pol_byte
call find_char
mov r0,#digits_n
call copy_data
mov r0,#8
mov dptr,#pol_ascii1
call pol_byte
call find_char
mov r0,#digits_n+1
call copy_data
mov a,#75
call init_transition
setb ea
ret
process_bcd: mov a,inputs
rr a
rr a
anl a,#00111111b
mov r0,a
mov a,p0
anl a,#11000000b
orl a,r0
xch a,bcd_inputs
xrl a,bcd_inputs
jz pb_ret
cpl a
pb_ret: ret
show_bcd: clr ea
mov a,bcd_inputs
mov c,acc.4
mov going_dn_n,c
mov c,acc.5
mov going_up_n,c
anl a,#00001111b
mov r0,a
mov a,bcd_inputs
anl a,#11000000b
rl a
rl a
xrl a,#1
add a,r0
rl a
add a,#low(number_table)
mov dpl,a
clr a
addc a,#high(number_table)
mov dph,a
clr a
movc a,@a+dptr
mov r7,a
mov a,#1
movc a,@a+dptr
mov r6,a
call find_char
mov r0,#digits_n
call copy_data
mov a,r7
call find_char
mov r0,#digits_n+1
call copy_data
mov a,#100
call init_transition
setb ea
ret
initial_thread: mov p0,#11100000b
mov p3,#0ffh
clr going_dn_o
clr going_up_o
clr clock_old
clr a
mov data_cnt,a
mov clock_cnt,a
mov pol_index,a
mov bcd_inputs,#0aah
call init_outputs
input_main_lp: call rst_wd
call read_inputs
call process_bcd
jz iml_skip1
call show_bcd
iml_skip1: call detect_clock
jz iml_skip2
call process_data
jz iml_skip2
call show_data
iml_skip2: jmp input_main_lp