uxn

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

commit 716d04890662d0de34f6ffe0c9f06f98f11d581e
parent 50b11f12ca583bbd382cf47de7c4f7f8de0fb496
Author: neauoire <aliceffekt@gmail.com>
Date:   Mon, 19 Apr 2021 21:33:52 -0700

Working example for dev.control

Diffstat:
Metc/usm.sublime-syntax | 32++++++++++++++++----------------
Mprojects/examples/dev.controller.buttons.usm | 115++++++++++++++++++++++++++-----------------------------------------------------
Msrc/assembler.c | 34+++++++++++++++++++---------------
3 files changed, 72 insertions(+), 109 deletions(-)

diff --git a/etc/usm.sublime-syntax b/etc/usm.sublime-syntax @@ -18,26 +18,19 @@ contexts: - match: '\|(\S+)\s?' scope: variable.control pop: true - # variables - - match: '\;(\S+)\s?' - scope: string.control + - match: '\$(\S+)\s?' + scope: variable.control pop: true # constants - match: '\:(\S+)\s?' scope: string.control pop: true # structs - - match: '\&(\S+)\s?' - scope: string.control - pop: true - - match: '\$(\S+)\s?' - scope: string.control - pop: true # Special - - match: '\~(\S+)\s?' - scope: entity.name.type + - match: '\&(\S+)\s?' + scope: string.control pop: true - match: '\=(\S+)\s?' scope: entity.name.type @@ -45,19 +38,26 @@ contexts: # Pushing to stack - - match: '\,(\S+)\s?' + - match: '\^(\S+)\s?' scope: keyword.control pop: true - - match: '\.(\S+)\s?' + - match: '\#(\S+)\s?' scope: keyword.control pop: true - - match: '\^(\S+)\s?' - scope: keyword.control + + + # Addressing + - match: '\.(\S+)\s?' # zero-page + scope: variable.control pop: true - - match: '\#(\S+)\s?' + - match: '\,(\S+)\s?' # relative + scope: entity.name.type + pop: true + - match: '\;(\S+)\s?' # absolute scope: keyword.control pop: true + # Blocks - match: '\{' diff --git a/projects/examples/dev.controller.buttons.usm b/projects/examples/dev.controller.buttons.usm @@ -1,119 +1,78 @@ ( Dev/Controller ) -%++ { #0001 ADD2 } -%-- { #0001 SUB2 } +%++ { #0001 ADD2 } %-- { #0001 SUB2 } %2/ { #0002 DIV2 } ( variables ) -@slime [ - &color 00 - &end -] +@slime $1 ( devices ) -|0100 @System [ - &vector 0000 - &pad 0000 - 0000 - 0000 - &r 0daf - &g 02ff - &b 035f - &end -] - -|0110 @Console [ - &pad 0000 - 0000 - 0000 - 0000 - &char 00 - &byte 00 - &short 0000 - &string 0000 - &end -] - -|0120 @Screen [ - &vector 0000 - &width 0000 - &height 0000 - &pad 0000 - &x 0000 - &y 0000 - &addr 0000 - &color 00 - &end -] - -|0140 @Controller [ - &vector 0000 - &button 00 - &key 00 - &end -] +|0100 @System &vector $2 &pad $6 &r $2 &g $2 &b $2 +|0110 @Console &pad $8 &char $1 &byte $1 &short $2 &string $2 +|0120 @Screen &vector $2 &width $2 &height $2 &pad $2 &x $2 &y $2 &addr $2 &color $1 +|0140 @Controller &vector $2 &button $1 &key $1 |0200 ( theme ) - #0daf ,System/r STR2 - #02ff ,System/g STR2 - #035f ,System/b STR2 + #0daf ;System/r STR2 + #02ff ;System/g STR2 + #035f ;System/b STR2 ( vectors ) - ,on-frame ,Screen/vector STR2 + ;on-frame ;Screen/vector STR2 ( set origin ) - ,Screen/width LDR2 2/ ,Screen/x STR2 - ,Screen/height LDR2 2/ ,Screen/y STR2 - ,default_icn ,Screen/addr STR2 - #31 ,Screen/color POK2 - #2a ,slime/color POK2 + ;Screen/width LDR2 2/ ;Screen/x STR2 + ;Screen/height LDR2 2/ ;Screen/y STR2 + ;default_icn ;Screen/addr STR2 + #31 ;Screen/color POK2 + #2a .slime POK BRK @on-frame - #2a ,slime/color POK2 - ,default_icn ,Screen/addr STR2 + #2a .slime POK + ;default_icn ;Screen/addr STR2 ( hold ctrl key to change slime color ) - ,Controller/button PEK2 #0f AND - DUP #01 NEQ ^&no-ctrl JNZ #25 ,slime/color POK2 &no-ctrl - DUP #02 NEQ ^&no-alt JNZ #2f ,slime/color POK2 &no-alt + ;Controller/button PEK2 #0f AND + DUP #01 NEQ ,&no-ctrl JNZ #25 .slime POK &no-ctrl + DUP #02 NEQ ,&no-alt JNZ #2f .slime POK &no-alt POP - ( clear ) #30 ,Screen/color POK2 + ( clear ) #30 ;Screen/color POK2 ( detect movement ) - ,Controller/button PEK2 #f0 AND - DUP #04 SFT #01 AND #01 NEQ ^&no-up JNZ + ;Controller/button PEK2 #f0 AND + DUP #04 SFT #01 AND #01 NEQ ,&no-up JNZ ( move ) - ,Screen/y LDR2 -- ,Screen/y STR2 - ,up_icn ,Screen/addr STR2 &no-up - DUP #05 SFT #01 AND #01 NEQ ^&no-down JNZ + ;Screen/y LDR2 -- ;Screen/y STR2 + ;up_icn ;Screen/addr STR2 &no-up + DUP #05 SFT #01 AND #01 NEQ ,&no-down JNZ ( move ) - ,Screen/y LDR2 ++ ,Screen/y STR2 - ,down_icn ,Screen/addr STR2 &no-down - DUP #06 SFT #01 AND #01 NEQ ^&no-left JNZ + ;Screen/y LDR2 ++ ;Screen/y STR2 + ;down_icn ;Screen/addr STR2 &no-down + DUP #06 SFT #01 AND #01 NEQ ,&no-left JNZ ( move ) - ,Screen/x LDR2 -- ,Screen/x STR2 - ,left_icn ,Screen/addr STR2 &no-left - DUP #07 SFT #01 AND #01 NEQ ^&no-right JNZ + ;Screen/x LDR2 -- ;Screen/x STR2 + ;left_icn ;Screen/addr STR2 &no-left + DUP #07 SFT #01 AND #01 NEQ ,&no-right JNZ ( move ) - ,Screen/x LDR2 ++ ,Screen/x STR2 - ,right_icn ,Screen/addr STR2 &no-right + ;Screen/x LDR2 ++ ;Screen/x STR2 + ;right_icn ;Screen/addr STR2 &no-right POP ( draw face ) - #31 ,Screen/color POK2 + #31 ;Screen/color POK2 ( draw slime ) - ,slime_icn ,Screen/addr STR2 - ,slime/color PEK2 ,Screen/color POK2 + ;slime_icn ;Screen/addr STR2 + .slime PEK ;Screen/color POK2 BRK diff --git a/src/assembler.c b/src/assembler.c @@ -210,9 +210,9 @@ walktoken(char *w) if(findopcode(w) || scmp(w, "BRK", 4)) return 1; switch(w[0]) { - case ',': return 3; /* lit2 addr-hb addr-lb */ - case '.': return 2; /* addr-hb addr-lb */ - case '^': return 2; /* Relative jump: lit addr-offset */ + case '.': return 2; /* zero-page: LIT addr-lb */ + case ';': return 3; /* absolute: LIT addr-hb addr-lb */ + case ',': return 2; /* Relative jump: lit addr-offset */ case '#': return (slen(w + 1) == 4 ? 3 : 2); } if((m = findmacro(w))) { @@ -231,18 +231,16 @@ parsetoken(char *w) Label *l; Macro *m; - if(w[0] == '^' && (l = findlabel(w + 1))) { - int off = l->addr - p.ptr - 3; - if(off < -126 || off > 126) { - printf("Address %s is too far(%d).\n", w, off); - return 0; - } - pushbyte((Sint8)(l->addr - p.ptr - 3), 1); - return ++l->refs; - } else if(w[0] == '.' && (l = findlabel(w + 1))) { - pushshort(l->addr, 0); + if(w[0] == '.' && (l = findlabel(w + 1))) { /* zero-page */ + pushbyte(l->addr, 1); return ++l->refs; } else if(w[0] == ',' && (l = findlabel(w + 1))) { + int off = l->addr - p.ptr - 3; + if(off < -126 || off > 126) + return error("Address is too far", w); + pushbyte((Sint8)off, 1); + return ++l->refs; + } else if(w[0] == ';' && (l = findlabel(w + 1))) { /* absolute */ pushshort(l->addr, 1); return ++l->refs; } else if((op = findopcode(w)) || scmp(w, "BRK", 4)) { @@ -302,7 +300,9 @@ pass1(FILE *f) if(shex(w + 1) < addr) return error("Memory Overwrite", w); addr = shex(w + 1); - } else + } else if(w[0] == '$') + addr += shex(w + 1); + else addr += walktoken(w); } rewind(f); @@ -324,7 +324,11 @@ pass2(FILE *f) p.ptr = shex(w + 1); continue; } - if(w[0] == '@') { + else if(w[0] == '$') { + p.ptr += shex(w + 1); + continue; + } + else if(w[0] == '@') { scpy(w + 1, scope, 64); continue; }