commit dcc37fd0d51f608ccd97dcd91b28f05c0905af8d
parent 60315ff3dc56f53c8e3c7a6d37cb918767eae19a
Author: neauoire <aliceffekt@gmail.com>
Date: Mon, 11 Apr 2022 16:07:15 -0700
Added logic/arithmetic symbols to uxnasm
Diffstat:
2 files changed, 81 insertions(+), 79 deletions(-)
diff --git a/projects/software/launcher.tal b/projects/software/launcher.tal
@@ -1,10 +1,5 @@
( launcher )
-%+ { ADD } %- { SUB } %* { MUL } %/ { DIV }
-%< { LTH } %> { GTH } %= { EQU } %! { NEQ }
-%++ { ADD2 } %-- { SUB2 } %** { MUL2 } %// { DIV2 }
-%<< { LTH2 } %>> { GTH2 } %== { EQU2 } %!! { NEQ2 }
-
%2* { #10 SFT } %2/ { #01 SFT } %2** { #10 SFT2 } %2// { #01 SFT2 }
%4* { #20 SFT } %4/ { #02 SFT } %4** { #20 SFT2 } %4// { #02 SFT2 }
%8* { #30 SFT } %8/ { #03 SFT } %8** { #30 SFT2 } %8// { #03 SFT2 }
@@ -26,7 +21,7 @@
%DEBUG { ;print-hex/byte JSR2 #0a EMIT }
%DEBUG2 { ;print-hex JSR2 #0a EMIT }
-%LINES-COUNT { .browser/y2 LDZ2 .browser/y LDZ2 -- 10// NIP }
+%LINES-COUNT { .browser/y2 LDZ2 .browser/y LDZ2 SUB2 10// NIP }
( devices )
@@ -82,7 +77,7 @@
( place )
#0088 .browser/x STZ2
#0010 .browser/y STZ2
- .Screen/height DEI2 #33 SFT2 #0011 -- .browser/y2 STZ2
+ .Screen/height DEI2 #33 SFT2 #0011 SUB2 .browser/y2 STZ2
( draw mascot )
#0010 #0010 #0060 #0060 ;mascot-icn #01 ;draw-icn JSR2
@@ -115,28 +110,28 @@ BRK
( draw new cursor )
.Mouse/x DEI2 DUP2 .pointer/x STZ2 .Screen/x DEO2
.Mouse/y DEI2 DUP2 .pointer/y STZ2 .Screen/y DEO2
- #41 .Mouse/state DEI #01 = + .Screen/sprite DEO
+ #41 .Mouse/state DEI #01 EQU ADD .Screen/sprite DEO
( wheel )
.Mouse/scrolly INC DEI
- DUP #ff ! ,&no-up JCN
- .browser/scroll LDZ #00 = ,&no-up JCN
- DUP .browser/scroll LDZ + ;scroll-to JSR2
+ DUP #ff NEQ ,&no-up JCN
+ .browser/scroll LDZ #00 EQU ,&no-up JCN
+ DUP .browser/scroll LDZ ADD ;scroll-to JSR2
&no-up
- DUP #01 ! ,&no-down JCN
- .browser/scroll LDZ .browser/lines LDZ = ,&no-down JCN
- DUP .browser/scroll LDZ + ;scroll-to JSR2
+ DUP #01 NEQ ,&no-down JCN
+ .browser/scroll LDZ .browser/lines LDZ EQU ,&no-down JCN
+ DUP .browser/scroll LDZ ADD ;scroll-to JSR2
&no-down
POP
( within browser )
- .Mouse/y DEI2 .browser/y LDZ2 << ,&outside JCN
- .Mouse/y DEI2 .browser/y2 LDZ2 #0010 -- >> ,&outside JCN
+ .Mouse/y DEI2 .browser/y LDZ2 LTH2 ,&outside JCN
+ .Mouse/y DEI2 .browser/y2 LDZ2 #0010 SUB2 GTH2 ,&outside JCN
( select choice )
- .Mouse/y DEI2 .browser/y LDZ2 --
- 10// NIP .browser/scroll LDZ + ;select-file JSR2
+ .Mouse/y DEI2 .browser/y LDZ2 SUB2
+ 10// NIP .browser/scroll LDZ ADD ;select-file JSR2
( run choice )
- .Mouse/state DEI #00 = ,&no-click JCN
+ .Mouse/state DEI #00 EQU ,&no-click JCN
.browser/sel LDZ ;run-file JSR2
&no-click
&outside
@@ -147,26 +142,26 @@ BRK
( controller )
.Controller/button DEI
- DUP #10 ! ,&no-up JCN
- .browser/sel LDZ #00 = ,&no-up JCN
- .browser/sel LDZ #01 - ;select-file JSR2
+ DUP #10 NEQ ,&no-up JCN
+ .browser/sel LDZ #00 EQU ,&no-up JCN
+ .browser/sel LDZ #01 SUB ;select-file JSR2
;follow-selection JSR2
POP BRK
&no-up
- DUP #20 ! ,&no-down JCN
- .browser/sel LDZ INC .browser/lines LDZ = ,&no-down JCN
+ DUP #20 NEQ ,&no-down JCN
+ .browser/sel LDZ INC .browser/lines LDZ EQU ,&no-down JCN
.browser/sel LDZ INC ;select-file JSR2
;follow-selection JSR2
POP BRK
&no-down
- DUP #01 ! ,&no-a JCN
+ DUP #01 NEQ ,&no-a JCN
.browser/sel LDZ ;run-file JSR2
POP BRK
&no-a
POP
( keyboard )
.Controller/key DEI
- DUP #0d ! ,&no-enter JCN
+ DUP #0d NEQ ,&no-enter JCN
.browser/sel LDZ ;run-file JSR2
POP BRK
&no-enter
@@ -185,7 +180,7 @@ BRK
( split with null-char )
;dir/data
&while
- LDAk #1f > ,&no-lb JCN
+ LDAk #1f GTH ,&no-lb JCN
( split ) STH2k #00 STH2r STA
( count lines ) .browser/lines LDZk INC SWP STZ
&no-lb
@@ -197,23 +192,23 @@ RTN
@select-file ( id -- )
( has changed )
- DUP .browser/last LDZ ! ,&has-changed JCN
+ DUP .browser/last LDZ NEQ ,&has-changed JCN
POP RTN
&has-changed
( beyond )
- DUP .browser/lines LDZ < ,&valid JCN
+ DUP .browser/lines LDZ LTH ,&valid JCN
POP RTN
&valid
#00 ;draw-browser JSR2
DUP .browser/sel STZ
DUP .browser/last STZ
- #30 + .Audio0/pitch DEO
+ #30 ADD .Audio0/pitch DEO
#01 ;draw-browser JSR2
( draw mascot )
#0010 #0010 #0060 #0060
- ;mascot-icn [ .browser/sel LDZ #03 AND TOS #0480 ** ++ ] #01
+ ;mascot-icn [ .browser/sel LDZ #03 AND TOS #0480 MUL2 ADD2 ] #01
;draw-icn JSR2
( draw position )
@@ -222,18 +217,18 @@ RTN
#0080 .Screen/y DEO2
.browser/sel LDZ #02 ;draw-byte JSR2
LIT '/ #02 ;draw-char JSR2
- .browser/lines LDZ #01 - #02 ;draw-byte JSR2
+ .browser/lines LDZ #01 SUB #02 ;draw-byte JSR2
AUTO-NONE
RTN
@follow-selection ( -- )
- LINES-COUNT .browser/sel LDZ .browser/scroll LDZ -
- DUP2 > ,&no-down JCN
+ LINES-COUNT .browser/sel LDZ .browser/scroll LDZ SUB
+ DUP2 GTH ,&no-down JCN
.browser/scroll LDZ INC ,scroll-to JSR
&no-down
- DUP2 SWP < ,&no-up JCN
+ DUP2 SWP LTH ,&no-up JCN
.browser/sel LDZ ,scroll-to JSR
&no-up
POP2
@@ -245,11 +240,11 @@ RTN
STH
( more lines than visible )
.browser/lines LDZ LINES-COUNT
- DUP2 > ,&can-scroll JCN
+ DUP2 GTH ,&can-scroll JCN
POPr POP2 RTN
&can-scroll
( less than max scroll )
- - INC STHkr > ,&valid-scroll JCN
+ SUB INC STHkr GTH ,&valid-scroll JCN
POPr RTN
&valid-scroll
#00 ;draw-browser JSR2
@@ -264,11 +259,11 @@ RTN
#0000 .Controller/button DEO2
#00 .Mouse/state DEO
- ;get-entry JSR2 #0005 ++
+ ;get-entry JSR2 #0005 ADD2
DUP2 ;check-rom JSR2 ,&valid JCN
( check if tal file )
- DUP2 ;scap JSR2 #0004 -- ;&tal-ext ;scmp JSR2 #01 ! ,&no-tal JCN
+ DUP2 ;scap JSR2 #0004 SUB2 ;&tal-ext ;scmp JSR2 #01 NEQ ,&no-tal JCN
( assemble tal file )
DUP2 ;&output-path ;scpy JSR2
;&rom-ext ;&output-path ;scat JSR2
@@ -297,26 +292,26 @@ RTN
@draw-browser ( mask -- )
( when empty )
- .browser/lines LDZ #01 = ;draw-browser-empty JCN2
+ .browser/lines LDZ #01 EQU ;draw-browser-empty JCN2
STH
( draw hand )
- .browser/x LDZ2 #0018 -- .browser/y LDZ2
- .browser/sel LDZ .browser/scroll LDZ - TOS 10** ++
+ .browser/x LDZ2 #0018 SUB2 .browser/y LDZ2
+ .browser/sel LDZ .browser/scroll LDZ SUB TOS 10** ADD2
#0010 #0010
- ;hand-icn STHkr #02 * ;draw-icn JSR2
+ ;hand-icn STHkr #02 MUL ;draw-icn JSR2
( draw files )
LINES-COUNT #00
&loop
( reached end )
- DUP INC .browser/lines LDZ > ,&end JCN
+ DUP INC .browser/lines LDZ GTH ,&end JCN
( has file )
.browser/x LDZ2 .Screen/x DEO2
- #00 OVR 10** .browser/y LDZ2 ++ .Screen/y DEO2
- DUP .browser/scroll LDZ + ;get-entry JSR2
+ #00 OVR 10** .browser/y LDZ2 ADD2 .Screen/y DEO2
+ DUP .browser/scroll LDZ ADD ;get-entry JSR2
DUP2 ;get-type JSR2 ;draw-type JSR2
- #01 STHkr * ;draw-str JSR2
+ #01 STHkr MUL ;draw-str JSR2
INC GTHk ,&loop JCN
&end
POP2
@@ -337,7 +332,7 @@ RTN
@get-type ( line* -- type )
- ;scap JSR2 #0004 -- ;&rom-ext ;scmp JSR2
+ ;scap JSR2 #0004 SUB2 ;&rom-ext ;scmp JSR2
RTN
&rom-ext ".rom $1
@@ -348,10 +343,10 @@ RTN
( counter ) LITr 00
;dir/length LDA2 #0000
&loop
- EQUkr STHr #00 = ,&no-reached JCN
- POP2r NIP2 ;dir/data ++ RTN
+ EQUkr STHr #00 EQU ,&no-reached JCN
+ POP2r NIP2 ;dir/data ADD2 RTN
&no-reached
- DUP2 ;dir/data ++ LDA #00 ! ,&no-lb JCN
+ DUP2 ;dir/data ADD2 LDA #00 NEQ ,&no-lb JCN
INCr
&no-lb
INC2 GTH2k ,&loop JCN
@@ -363,17 +358,17 @@ RTN
@draw-type ( type -- )
- STHk TOS 20** ;file-icns ++ .Screen/addr DEO2
+ STHk TOS 20** ;file-icns ADD2 .Screen/addr DEO2
AUTO-XADDR
- #02 STHkr - .Screen/sprite DEOk DEO
+ #02 STHkr SUB .Screen/sprite DEOk DEO
- .Screen/x DEI2k #0010 -- ROT DEO2
- .Screen/y DEI2k #0008 ++ ROT DEO2
+ .Screen/x DEI2k #0010 SUB2 ROT DEO2
+ .Screen/y DEI2k #0008 ADD2 ROT DEO2
- #02 STHr - .Screen/sprite DEOk DEO
+ #02 STHr SUB .Screen/sprite DEOk DEO
- .Screen/x DEI2k #0008 ++ ROT DEO2
- .Screen/y DEI2k #0008 -- ROT DEO2
+ .Screen/x DEI2k #0008 ADD2 ROT DEO2
+ .Screen/y DEI2k #0008 SUB2 ROT DEO2
AUTO-NONE
RTN
@@ -431,10 +426,10 @@ RTN
@draw-char ( char color -- )
SWP
- [ #20 - #00 SWP #40 SFT2 ;font ++ ] .Screen/addr DEO2
+ [ #20 SUB #00 SWP #40 SFT2 ;font ADD2 ] .Screen/addr DEO2
.Screen/sprite DEOk DEO
- .Screen/x DEI2k #0008 ++ ROT DEO2
- .Screen/y DEI2k #0010 -- ROT DEO2
+ .Screen/x DEI2k #0008 ADD2 ROT DEO2
+ .Screen/y DEI2k #0010 SUB2 ROT DEO2
JMP2r
@@ -448,7 +443,7 @@ JMP2r
#0006 .File/length DEO2
#fffa .File/read DEO2
- .File/success DEI2 #0006 !! ,&ignore JCN
+ .File/success DEI2 #0006 NEQ2 ,&ignore JCN
#fffa LDA2 .System/r DEO2
#fffc LDA2 .System/g DEO2
#fffe LDA2 .System/b DEO2
@@ -484,10 +479,10 @@ JMP2r
STH2
&loop
- LDAk LDAkr STHr = ,¬-diff JCN
+ LDAk LDAkr STHr EQU ,¬-diff JCN
POP2 POP2r #00 RTN
¬-diff
- LDAk LDAkr STHr #0000 !! ,¬-end JCN
+ LDAk LDAkr STHr #0000 NEQ2 ,¬-end JCN
POP2 POP2r #01 RTN
¬-end
INC2 INC2r
diff --git a/src/uxnasm.c b/src/uxnasm.c
@@ -54,8 +54,8 @@ static char ops[][4] = {
"LDZ", "STZ", "LDR", "STR", "LDA", "STA", "DEI", "DEO",
"ADD", "SUB", "MUL", "DIV", "AND", "ORA", "EOR", "SFT"
};
-static char sym_glyph[] = {'?', '!', '>', '<', '+', '-', '*', '/'};
-static Uint8 sym_value[] = {0x08, 0x09, 0x0a, 0x1b, 0x18, 0x19, 0x1a, 0x1b};
+static char symchr[] = {'?', '!', '>', '<', '+', '-', '*', '/'};
+static Uint8 symval[] = {0x08, 0x09, 0x0a, 0x1b, 0x18, 0x19, 0x1a, 0x1b};
static int scmp(char *a, char *b, int len) { int i = 0; while(a[i] == b[i]) if(!a[i] || ++i >= len) return 1; return 0; } /* string compare */
static int sihx(char *s) { int i = 0; char c; while((c = s[i++])) if(!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f')) return 0; return i > 1; } /* string is hexadecimal */
@@ -102,26 +102,33 @@ findlabel(char *name)
}
static Uint8
+findmode(char *s)
+{
+ int i = 0;
+ while(s[0]) {
+ switch(s[0]) {
+ case '2': i |= (1 << 5); break; /* mode: short */
+ case 'r': i |= (1 << 6); break; /* mode: return */
+ case 'k': i |= (1 << 7); break; /* mode: keep */
+ }
+ s++;
+ }
+ return i;
+}
+
+static Uint8
findopcode(char *s)
{
int i;
for(i = 0; i < 0x20; i++) {
- int m = 0;
if(!scmp(ops[i], s, 3))
continue;
if(!i) i |= (1 << 7); /* force keep for LIT */
- while(s[3 + m]) {
- if(s[3 + m] == '2')
- i |= (1 << 5); /* mode: short */
- else if(s[3 + m] == 'r')
- i |= (1 << 6); /* mode: return */
- else if(s[3 + m] == 'k')
- i |= (1 << 7); /* mode: keep */
- else
- return 0; /* failed to match */
- m++;
- }
- return i;
+ return i |= findmode(s + 3);
+ }
+ for(i = 0; i < 0x08; ++i) {
+ if(s[0] == symchr[i])
+ return symval[i] |= findmode(s + 1);
}
return 0;
}