;************************************************************************ ;* * ;* serial output routines * ;* * ;************************************************************************ hexout: push a swap a rcall _hexo1 ;upper nibble pop a ;lower nibble _hexo1: andi a, 0x0F mifl a, 10, _hexo2 subi a, -7 _hexo2: subi a, -0x30 ; rjmp putchar ;------------------------------------------------------------------------ putchar: tst stx_state brne putchar ;wait until previous byte sent mov stx_data, a ldi stx_state, 9 + stop_bits ;10/11 bits ret ;------------------------------------------------------------------------ tx_finish: tst stx_state brne tx_finish ret ;------------------------------------------------------------------------ ;output 0 terminated string constant defined after call ;if .db count was odd, it must be expand by 00 ;and then after return NOP (=0000) was executed puts: pop zh ;get pointer to string pop zl lsl zl ;adjust for byte access rol zh rjmp _put2 _put1: mov a, r0 rcall putchar _put2: lpm adiw zl, 1 tst r0 ;0 = end of string brne _put1 lsr zh ;readjust for word access ror zl ijmp ;return after string ;------------------------------------------------------------------------