commit e2b6b6907dc4bbe16bc3f5e7880b0fa0e6a3a747
parent 678b26c942c1533bd1258b2626db887cf4cf1807
Author: neauoire <aliceffekt@gmail.com>
Date: Fri, 5 Feb 2021 10:51:45 -0800
Added constants
Diffstat:
6 files changed, 126 insertions(+), 74 deletions(-)
diff --git a/README.md b/README.md
@@ -12,18 +12,19 @@ cc uxn.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -o uxn
### Write
-- `;variable`, set a name to address on the zero-page
-- `:label`, set a name to an address
+- `;variable`, set a label to an assigned address
+- `:const`, set a label to a constant short
+- `@label`, set a label to an address
### Read
-- `,literal`, get a literal pointer
-- `.pointer`, get a raw pointer
+- `,literal`, push label value to stack
+- `.pointer`, read label value
### Special
-- `@0010`, move to position in the program
-- `( comment )`
+- `( comment )`, toggle parsing on/off
+- `|0010`, move to position in the program
```
;value ( alloc a zero-page variable )
@@ -49,7 +50,6 @@ cc uxn.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -o uxn
### Assembler
- Catch overflow/underflow
-- Constants
- Jumps should be relative
### CPU
@@ -63,6 +63,10 @@ cc uxn.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -o uxn
- Build PPU
- Add flags..
+### Devices
+
+- Devices each have an input byte, an output byte and two request bytes.
+
## Refs
https://code.9front.org/hg/plan9front/file/a7f9946e238f/sys/src/games/nes/cpu.c
diff --git a/etc/usm.sublime-syntax b/etc/usm.sublime-syntax
@@ -0,0 +1,48 @@
+%YAML 1.2
+---
+# See http://www.sublimetext.com/docs/3/syntax.html
+name: Uxn Assembly
+scopeName: usm.
+fileTypes: [usm]
+file_extensions:
+ - usm
+scope: source.usm
+
+contexts:
+ prototype:
+ - include: comments
+
+ main:
+ - include: keywords
+ - include: numbers
+ - include: strings
+
+ numbers:
+ - match: '\|(\S+)\s?'
+ scope: punctuation.definition
+ pop: true
+
+ strings:
+ - match: '\:(\S+)\s?'
+ scope: string.control
+ pop: true
+ - match: '\;(\S+)\s?'
+ scope: string.control
+ pop: true
+ - match: '\_(\S+)\s?'
+ scope: string.control
+ pop: true
+ - match: '\,(\S+)\s?'
+ scope: keyword.control
+ pop: true
+ - match: '\.(\S+)\s?'
+ scope: keyword.control
+ pop: true
+
+ comments:
+ - match: '\('
+ scope: punctuation.definition.comment.tome
+ push:
+ - meta_scope: comment.line.double-slash.tome
+ - match: '\)'
+ pop: true
diff --git a/examples/blank.usm b/examples/blank.usm
@@ -0,0 +1,27 @@
+( blank project )
+
+;variable1
+;variable2
+_constant1 abcd
+
+|0100 ( -------------------------------- )
+
+:RESET BRK
+
+|c000 ( -------------------------------- )
+
+:FRAME ( FRAME-START )
+
+
+
+BRK ( FRAME-END )
+
+|d000 ( -------------------------------- )
+
+:ERROR BRK
+
+|FFFA ( -------------------------------- )
+
+.RESET
+.FRAME
+.ERROR
diff --git a/examples/core.usm b/examples/core.usm
@@ -1,27 +1,29 @@
-( define some variables in the zero-page )
+( blank project )
-;var1
-;var2
+;variable1
+:constant1 9abc
-@0100
+|0100 ( -------------------------------- )
-:RESET ( --- )
- ,1234
- BRK
+@RESET
-@c000 ( much further.. )
+,abcd
-:FRAME ( --- )
- ,ab ,0008 str
- BRK
+BRK ( RESET-END )
-@d000 ( further still.. )
+|c000 ( -------------------------------- )
-:ERROR ( --- )
- ,cdef
- BRK
+@FRAME ( FRAME-START )
-@FFFA ( vectors, last 3 shorts )
+,abcd
+
+BRK ( FRAME-END )
+
+|d000 ( -------------------------------- )
+
+@ERROR BRK
+
+|FFFA ( -------------------------------- )
.RESET
.FRAME
diff --git a/extras/usm.sublime-syntax b/extras/usm.sublime-syntax
@@ -1,45 +0,0 @@
-%YAML 1.2
----
-# See http://www.sublimetext.com/docs/3/syntax.html
-name: Uxn Assembly
-scopeName: usm.
-fileTypes: [usm]
-file_extensions:
- - usm
-scope: source.usm
-
-contexts:
- prototype:
- - include: comments
-
- main:
- - include: keywords
- - include: numbers
- - include: strings
-
- numbers:
- - match: '\@(\S+)\s?'
- scope: punctuation.definition
- pop: true
-
- strings:
- - match: '\:(\S+)\s?'
- scope: string.control
- pop: true
- - match: '\;(\S+)\s?'
- scope: string.control
- pop: true
- - match: '\,(\S+)\s?'
- scope: keyword.control
- pop: true
- - match: '\.(\S+)\s?'
- scope: keyword.control
- pop: true
-
- comments:
- - match: '\('
- scope: punctuation.definition.comment.tome
- push:
- - meta_scope: comment.line.double-slash.tome
- - match: '\)'
- pop: true
diff --git a/uxnasm.c b/uxnasm.c
@@ -103,7 +103,7 @@ shex(char *s) /* string to num */
else if(c >= 'A' && c <= 'F')
n = n * 16 + 10 + (c - 'A');
else if(c >= 'a' && c <= 'f')
- n = n * 16 + 10 + (c - 'f');
+ n = n * 16 + 10 + (c - 'a');
return n;
}
@@ -191,6 +191,14 @@ makelabel(char *id, Uint16 addr)
}
int
+makeconst(char *id, FILE *f)
+{
+ char wv[64];
+ fscanf(f, "%s", wv);
+ return makelabel(id, shex(wv));
+}
+
+int
pass1(FILE *f)
{
int skip = 0, vars = 0;
@@ -199,16 +207,22 @@ pass1(FILE *f)
while(fscanf(f, "%s", w) == 1) {
if(iscomment(w, &skip)) continue;
suca(w);
- if(w[0] == ':' && !makelabel(w + 1, addr))
+ if(w[0] == '@' && !makelabel(w + 1, addr))
return error("Pass1 failed", w);
if(w[0] == ';' && !makelabel(w + 1, vars++))
return error("Pass1 failed", w);
+ if(w[0] == ':') {
+ if(!makeconst(w + 1, f))
+ return error("Pass1 failed", w);
+ else
+ continue;
+ }
/* move addr ptr */
if(findop(w) || scmp(w, "BRK"))
addr += 1;
- else if(w[0] == '@') {
+ else if(w[0] == '|')
addr = shex(w + 1);
- } else if(w[0] == ':')
+ else if(w[0] == '@')
addr += 0;
else if(w[0] == ';')
addr += 0;
@@ -233,12 +247,14 @@ pass2(FILE *f)
while(fscanf(f, "%s", w) == 1) {
Uint8 op = 0;
Label *l;
- if(w[0] == ':') continue;
+ if(w[0] == '@') continue;
if(w[0] == ';') continue;
suca(w);
if(iscomment(w, &skip) || ismarker(w)) continue;
- if(w[0] == '@')
+ if(w[0] == '|')
p.ptr = shex(w + 1);
+ else if(w[0] == ':')
+ fscanf(f, "%s", w);
else if((op = findop(w)) || scmp(w, "BRK"))
pushbyte(op, 0);
else if((l = findlabel(w + 1)))