aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/avr8/words/icompare.asm
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-08-19 12:15:28 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-08-19 12:15:28 +0200
commit67d25d837ac55f28a366c0a3b262e439a6e75fc3 (patch)
treedf7715c7724c5935ab87c807f3b8b4ef529315e3 /amforth-6.5/avr8/words/icompare.asm
parente0d6784e89dba33226c0edb815bb974486fa7c48 (diff)
Add AmForth
Diffstat (limited to 'amforth-6.5/avr8/words/icompare.asm')
-rw-r--r--amforth-6.5/avr8/words/icompare.asm103
1 files changed, 103 insertions, 0 deletions
diff --git a/amforth-6.5/avr8/words/icompare.asm b/amforth-6.5/avr8/words/icompare.asm
new file mode 100644
index 0000000..f0fbab5
--- /dev/null
+++ b/amforth-6.5/avr8/words/icompare.asm
@@ -0,0 +1,103 @@
+; ( r-addr r-len f-addr f-len -- f)
+; Tools
+; compares string in RAM with string in flash. f is zero if equal like COMPARE
+VE_ICOMPARE:
+ .dw $ff08
+ .db "icompare"
+ .dw VE_HEAD
+ .set VE_HEAD = VE_ICOMPARE
+XT_ICOMPARE:
+ .dw DO_COLON
+PFA_ICOMPARE:
+ .dw XT_TO_R ; ( -- r-addr r-len f-addr)
+ .dw XT_OVER ; ( -- r-addr r-len f-addr r-len)
+ .dw XT_R_FROM ; ( -- r-addr r-len f-addr r-len f-len )
+ .dw XT_NOTEQUAL ; ( -- r-addr r-len f-addr flag )
+ .dw XT_DOCONDBRANCH
+ .dw PFA_ICOMPARE_SAMELEN
+ .dw XT_2DROP
+ .dw XT_DROP
+ .dw XT_TRUE
+ .dw XT_EXIT
+PFA_ICOMPARE_SAMELEN:
+ .dw XT_SWAP ; ( -- r-addr f-addr len )
+ .dw XT_ZERO
+ .dw XT_QDOCHECK
+ .dw XT_DOCONDBRANCH
+ .dw PFA_ICOMPARE_DONE
+ .dw XT_DODO
+PFA_ICOMPARE_LOOP:
+ ; ( r-addr f-addr --)
+ .dw XT_OVER
+ .dw XT_FETCH
+.if WANT_IGNORECASE == 1
+ .dw XT_ICOMPARE_LC
+.endif
+ .dw XT_OVER
+ .dw XT_FETCHI ; ( -- r-addr f-addr r-cc f- cc)
+.if WANT_IGNORECASE == 1
+ .dw XT_ICOMPARE_LC
+.endif
+ ; flash strings are zero-padded at the last cell
+ ; that means: if the flash cell is less $0100, than mask the
+ ; high byte in the ram cell
+ .dw XT_DUP
+ ;.dw XT_BYTESWAP
+ .dw XT_DOLITERAL
+ .dw $100
+ .dw XT_ULESS
+ .dw XT_DOCONDBRANCH
+ .dw PFA_ICOMPARE_LASTCELL
+ .dw XT_SWAP
+ .dw XT_DOLITERAL
+ .dw $00FF
+ .dw XT_AND ; the final swap can be omitted
+PFA_ICOMPARE_LASTCELL:
+ .dw XT_NOTEQUAL
+ .dw XT_DOCONDBRANCH
+ .dw PFA_ICOMPARE_NEXTLOOP
+ .dw XT_2DROP
+ .dw XT_TRUE
+ .dw XT_UNLOOP
+ .dw XT_EXIT
+PFA_ICOMPARE_NEXTLOOP:
+ .dw XT_1PLUS
+ .dw XT_SWAP
+ .dw XT_CELLPLUS
+ .dw XT_SWAP
+ .dw XT_DOLITERAL
+ .dw 2
+ .dw XT_DOPLUSLOOP
+ .dw PFA_ICOMPARE_LOOP
+PFA_ICOMPARE_DONE:
+ .dw XT_2DROP
+ .dw XT_ZERO
+ .dw XT_EXIT
+
+.if WANT_IGNORECASE == 1
+; ( cc1 cc2 -- f)
+; Tools
+; compares two packed characters
+;VE_ICOMPARELC:
+; .dw $ff08
+; .db "icompare-lower"
+; .dw VE_HEAD
+; .set VE_HEAD = VE_ICOMPARELC
+XT_ICOMPARE_LC:
+ .dw DO_COLON
+PFA_ICOMPARE_LC:
+ .dw XT_DUP
+ .dw XT_DOLITERAL
+ .dw $00ff
+ .dw XT_AND
+ .dw XT_TOLOWER
+ .dw XT_SWAP
+ .dw XT_BYTESWAP
+ .dw XT_DOLITERAL
+ .dw $00ff
+ .dw XT_AND
+ .dw XT_TOLOWER
+ .dw XT_BYTESWAP
+ .dw XT_OR
+ .dw XT_EXIT
+.endif