From 67d25d837ac55f28a366c0a3b262e439a6e75fc3 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 19 Aug 2017 12:15:28 +0200 Subject: Add AmForth --- amforth-6.5/avr8/words/icompare.asm | 103 ++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 amforth-6.5/avr8/words/icompare.asm (limited to 'amforth-6.5/avr8/words/icompare.asm') 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 -- cgit v1.2.3