From: pito <pi...@vo...> - 2011-04-07 09:58:31
|
Hi, some time back I assembled this library for fast i/o. Maybe somebody fid is usefull. Not fully tested, no warranty of any kind. P. ============================================================= ; FAST i/o LIBRARY for amforth ; assembled from various sources ; Pito 1/2011 ; not fully tested and maybe not fully optimized ; no warranty of any kind (;-)) ; works via PINMASKS ; ( pinmask portadr -- ) fast pin_output port ; R( -- ) VE_PIN_OUT: .dw $ff0a .db "pin_output" .dw VE_HEAD .set VE_HEAD = VE_PIN_OUT XT_PIN_OUT: .dw PFA_PIN_OUT PFA_PIN_OUT: movw ZL, tosl sbiw Z, 1 ld R16, Z loadtos or R16, tosl st Z, R16 loadtos jmp DO_NEXT ; ( pinmask portadr -- ) fast pin_input port ; R( -- ) VE_PIN_INP: .dw $ff09 .db "pin_input",0 .dw VE_HEAD .set VE_HEAD = VE_PIN_INP XT_PIN_INP: .dw PFA_PIN_INP PFA_PIN_INP: movw ZL, tosl sbiw Z, 1 ld R16, Z loadtos com tosl and R16, tosl st Z, R16 loadtos jmp DO_NEXT ; ( pinmask portadr -- ) fast low port ; R( -- ) VE_LOW: .dw $ff03 .db "low",0 .dw VE_HEAD .set VE_HEAD = VE_LOW XT_LOW: .dw PFA_LOW PFA_LOW: movw ZL, tosl ld R16, Z loadtos com tosl and R16, tosl st Z, R16 loadtos jmp DO_NEXT ; ( pinmask portadr -- ) fast high port ; R( -- ) VE_HIGH: .dw $ff04 .db "high" .dw VE_HEAD .set VE_HEAD = VE_HIGH XT_HIGH: .dw PFA_HIGH PFA_HIGH: movw ZL, tosl ld R16, Z loadtos or R16, tosl st Z, R16 loadtos jmp DO_NEXT ; ( pinmask portadr -- ) fast toggle port ; R( -- ) VE_TOGGLE: .dw $ff06 .db "toggle" .dw VE_HEAD .set VE_HEAD = VE_TOGGLE XT_TOGGLE: .dw PFA_TOGGLE PFA_TOGGLE: movw ZL, tosl ld R16, Z loadtos eor R16, tosl st Z, R16 loadtos jmp DO_NEXT ; ( pinmask portadr -- c ) fast is_low? port ; R( -- ) VE_ISLOW: .dw $ff07 .db "is_low?",0 .dw VE_HEAD .set VE_HEAD = VE_ISLOW XT_ISLOW: .dw PFA_ISLOW PFA_ISLOW: movw ZL, tosl ld R16, Z com R16 loadtos and tosl, R16 clr tosh jmp DO_NEXT ; ( pinmask portadr -- c ) fast is_high? port ; R( -- ) VE_ISHIGH: .dw $ff08 .db "is_high?" .dw VE_HEAD .set VE_HEAD = VE_ISHIGH XT_ISHIGH: .dw PFA_ISHIGH PFA_ISHIGH: movw ZL, tosl ld R16, Z loadtos and tosl, R16 clr tosh jmp DO_NEXT ; ( pinmask portadr -- c ) fast pin_low? port ; R( -- ) VE_PINLOW: .dw $ff08 .db "pin_low?" .dw VE_HEAD .set VE_HEAD = VE_PINLOW XT_PINLOW: .dw PFA_PINLOW PFA_PINLOW: movw ZL, tosl sbiw ZL, 2 ld R16, Z com R16 loadtos and tosl, R16 clr tosh jmp DO_NEXT ; ( pinmask portadr -- c ) fast pin_high? port ; R( -- ) VE_PINHIGH: .dw $ff09 .db "pin_high?",0 .dw VE_HEAD .set VE_HEAD = VE_PINHIGH XT_PINHIGH: .dw PFA_PINHIGH PFA_PINHIGH: movw ZL, tosl sbiw ZL, 2 ld R16, Z loadtos and tosl, R16 clr tosh jmp DO_NEXT ; ( pinmask portadr -- c ) fast pin! port ; R( -- ) VE_PINSTORE: .dw $ff04 .db "pin!" .dw VE_HEAD .set VE_HEAD = VE_PINSTORE XT_PINSTORE: .dw PFA_PINSTORE PFA_PINSTORE: movw ZL, tosl ld R16, Z loadtos mov R17, tosl com tosl and R16, tosl loadtos and R17, tosl or R16, R17 st Z, R16 loadtos jmp DO_NEXT ; ( pinmask portadr -- c ) fast pin@ port ; R( -- ) VE_PINFETCH: .dw $ff04 .db "pin@" .dw VE_HEAD .set VE_HEAD = VE_PINFETCH XT_PINFETCH: .dw PFA_PINFETCH PFA_PINFETCH: movw ZL, tosl sbiw Z, 2 ld R16, Z loadtos and tosl, R16 clr tosh jmp DO_NEXT |