uxn

Varvara Ordinator, written in ANSI C(SDL2)
git clone https://git.eamoncaddigan.net/uxn.git
Log | Files | Refs | README | LICENSE

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:
Mprojects/software/launcher.tal | 123++++++++++++++++++++++++++++++++++++++-----------------------------------------
Msrc/uxnasm.c | 37++++++++++++++++++++++---------------
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 = ,&not-diff JCN + LDAk LDAkr STHr EQU ,&not-diff JCN POP2 POP2r #00 RTN &not-diff - LDAk LDAkr STHr #0000 !! ,&not-end JCN + LDAk LDAkr STHr #0000 NEQ2 ,&not-end JCN POP2 POP2r #01 RTN &not-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; }