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             




------------------------------------------------------------------------------
Xperia(TM) PLAY
It's a major breakthrough. An authentic gaming
smartphone on the nation's most reliable network.
And it wants your games.
http://p.sf.net/sfu/verizon-sfdev
_______________________________________________
Amforth-devel mailing list
Amforth-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/amforth-devel

Reply via email to