Browse code

Removing signed mode

neauoire authored on 16/03/2021 01:08:41
Showing 12 changed files
... ...
@@ -43,7 +43,7 @@ BRK
43 43
 	$loop NOP
44 44
 		( send ) DUP2 LDR =Console.char
45 45
 		( incr ) #0001 ADD2
46
-		( loop ) DUP2 LDR #00 NEQ ^$loop MUL JMPS 
46
+		( loop ) DUP2 LDR #00 NEQ ^$loop MUL JMP
47 47
 	POP2
48 48
 
49 49
 RTN    
... ...
@@ -47,7 +47,7 @@ Program p;
47 47
 char ops[][4] = {
48 48
 	"BRK", "NOP", "LIT", "LDR", "STR", "JMP", "JSR", "RTN", 
49 49
 	"EQU", "NEQ", "GTH", "LTH", "AND", "XOR", "ROL", "ROR",
50
-	"POP", "DUP", "SWP", "OVR", "ROT", "---", "WSR", "RSW",
50
+	"POP", "DUP", "SWP", "OVR", "ROT", "CLN", "WSR", "RSW",
51 51
 	"ADD", "SUB", "MUL", "DIV", "---", "---", "---", "---"
52 52
 };
53 53
 
... ...
@@ -20,5 +20,5 @@ cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werr
20 20
 # cc uxn.c emulator.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -L/usr/local/lib -lSDL2 -o bin/emulator
21 21
 
22 22
 # run
23
-./bin/assembler projects/software/left.usm bin/boot.rom
23
+./bin/assembler projects/software/nasu.usm bin/boot.rom
24 24
 ./bin/emulator bin/boot.rom
... ...
@@ -14,7 +14,7 @@ BRK
14 14
 	$loop NOP
15 15
 		( send ) DUP2 LDR =Console.char
16 16
 		( incr ) #0001 ADD2
17
-		( loop ) DUP2 LDR #00 NEQ ^$loop MUL JMPS 
17
+		( loop ) DUP2 LDR #00 NEQ ^$loop MUL JMP 
18 18
 	POP2
19 19
 
20 20
 RTN    
... ...
@@ -15,7 +15,7 @@
15 15
 	$draw-hor NOP
16 16
 		( draw ) #01 =Screen.color
17 17
 		( incr ) SWP2 #0002 ADD2 DUP2 =Screen.x SWP2
18
-		OVR2 OVR2 LTH2 ^$draw-hor SWP JMPS?
18
+		OVR2 OVR2 LTH2 ^$draw-hor SWP JMP?
19 19
 	POP2 POP2
20 20
 
21 21
 	( draw ver line )
... ...
@@ -24,7 +24,7 @@
24 24
 	$draw-ver NOP
25 25
 		( draw ) #02 =Screen.color
26 26
 		( incr ) SWP2 #0002 ADD2 DUP2 =Screen.y SWP2
27
-		OVR2 OVR2 LTH2 ^$draw-ver SWP JMPS?
27
+		OVR2 OVR2 LTH2 ^$draw-ver SWP JMP?
28 28
 	POP2 POP2
29 29
 
30 30
 	( draw blending modes )
... ...
@@ -34,7 +34,7 @@
34 34
 		( move ) OVR #00 SWP #0008 MUL2 #0020 ADD2 =Sprite.x
35 35
 		( draw ) OVR =Sprite.color
36 36
 		( incr ) SWP #01 ADD SWP 
37
-		DUP2 LTH ^$draw-blends SWP JMPS?
37
+		DUP2 LTH ^$draw-blends SWP JMP?
38 38
 	POP POP
39 39
 
40 40
 BRK
... ...
@@ -104,7 +104,7 @@ RTN
104 104
 		( draw ) DUP2 LDR #00 SWP #0008 MUL2 ,font ADD2 =Sprite.addr ~label.color =Sprite.color
105 105
 		( incr ) #0001 ADD2
106 106
 		( incr ) ~Sprite.x #0007 ADD2 =Sprite.x
107
-		DUP2 LDR #00 NEQ ^$loop MUL JMPS
107
+		DUP2 LDR #00 NEQ ^$loop MUL JMP
108 108
 	POP2
109 109
 
110 110
 RTN
... ...
@@ -117,9 +117,9 @@ RTN
117 117
 		$hor NOP
118 118
 			( draw ) ~color =Screen.color
119 119
 			( incr ) ~Screen.x #0001 ADD2 =Screen.x
120
-			~Screen.x ~rect.x2 LTH2 ^$hor MUL JMPS
120
+			~Screen.x ~rect.x2 LTH2 ^$hor MUL JMP
121 121
 		( incr ) ~Screen.y #0001 ADD2 =Screen.y
122
-		~Screen.y ~rect.y2 LTH2 ^$ver MUL JMPS
122
+		~Screen.y ~rect.y2 LTH2 ^$ver MUL JMP
123 123
 
124 124
 RTN
125 125
 
... ...
@@ -130,13 +130,13 @@ RTN
130 130
 		( incr ) ~Screen.x #0001 ADD2 =Screen.x
131 131
 		( draw ) ~rect.y1 =Screen.y ~color =Screen.color
132 132
 		( draw ) ~rect.y2 =Screen.y ~color =Screen.color
133
-		~Screen.x ~rect.x2 LTH2 ^$hor MUL JMPS
133
+		~Screen.x ~rect.x2 LTH2 ^$hor MUL JMP
134 134
 	~rect.y1 =Screen.y
135 135
 	$ver NOP
136 136
 		( draw ) ~rect.x1 =Screen.x ~color =Screen.color
137 137
 		( draw ) ~rect.x2 =Screen.x ~color =Screen.color
138 138
 		( incr ) ~Screen.y #0001 ADD2 =Screen.y
139
-		~Screen.y ~rect.y2 #0001 ADD2 LTH2 ^$ver MUL JMPS
139
+		~Screen.y ~rect.y2 #0001 ADD2 LTH2 ^$ver MUL JMP
140 140
 
141 141
 RTN
142 142
 
... ...
@@ -148,9 +148,9 @@ RTN
148 148
 		$hor NOP
149 149
 			( draw ) ~color =Sprite.color
150 150
 			( incr ) ~Sprite.x #0008 ADD2 =Sprite.x
151
-			~Sprite.x ~rect.x2 LTH2 ^$hor MUL JMPS
151
+			~Sprite.x ~rect.x2 LTH2 ^$hor MUL JMP
152 152
 		( incr ) ~Sprite.y #0008 ADD2 =Sprite.y
153
-		~Sprite.y ~rect.y2 LTH2 ^$ver MUL JMPS
153
+		~Sprite.y ~rect.y2 LTH2 ^$ver MUL JMP
154 154
 
155 155
 RTN
156 156
 
... ...
@@ -170,11 +170,11 @@ BRK
170 170
 
171 171
 	,$no-up ~Mouse.y #0008 GTH2 JMP2?
172 172
 		( decr ) ~scroll.y #00 ~scroll.y #0000 NEQ2 SUB2 =scroll.y
173
-		^$end JMPS
173
+		^$end JMP
174 174
 	$no-up 
175 175
 	,$no-down ~Mouse.y ~Screen.height #0008 SUB2 LTH2 JMP2?
176 176
 		( incr ) ~scroll.y #0001 ADD2 =scroll.y
177
-		^$end JMPS
177
+		^$end JMP
178 178
 	$no-down 
179 179
 	~Mouse.y #0008 SUB2 =scroll.y
180 180
 	$end
... ...
@@ -200,12 +200,12 @@ RTN
200 200
 	,$no-chord-cut ~Mouse.chord #01 NEQ JMP2?
201 201
 		,cut JSR2
202 202
 		( release ) #00 DUP =Mouse.state =Mouse.chord
203
-		^$end JMPS
203
+		^$end JMP
204 204
 	$no-chord-cut
205 205
 	,$no-chord-paste ~Mouse.chord #10 NEQ JMP2?
206 206
 		,paste JSR2
207 207
 		( release ) #00 DUP =Mouse.state =Mouse.chord
208
-		^$end JMPS
208
+		^$end JMP
209 209
 	$no-chord-paste
210 210
 
211 211
 	,$end ~Mouse.state #11 EQU JMP2?
... ...
@@ -214,7 +214,7 @@ RTN
214 214
 		( on drag )
215 215
 		,find-selection JSR2 #0001 ADD2 =selection.to
216 216
 		,clamp-selection JSR2
217
-		^$end JMPS
217
+		^$end JMP
218 218
 	$no-drag
219 219
 		( on click )
220 220
 		,find-selection JSR2 DUP2 =selection.from #0001 ADD2 =selection.to
... ...
@@ -231,7 +231,7 @@ RTN
231 231
 	,document.body =document.eof
232 232
 	$loop NOP
233 233
 		( incr ) ~document.eof #0001 ADD2 =document.eof
234
-	~document.eof LDR #00 NEQ ^$loop MUL JMPS
234
+	~document.eof LDR #00 NEQ ^$loop MUL JMP
235 235
 
236 236
 RTN
237 237
 
... ...
@@ -258,7 +258,7 @@ RTN
258 258
 	$loop NOP
259 259
 		( move ) ~j ~i ADD2 LDR ~j STR
260 260
 		( incr ) ~j #0001 ADD2 =j
261
-		~j ~document.eof LTH2 ^$loop MUL JMPS
261
+		~j ~document.eof LTH2 ^$loop MUL JMP
262 262
 	~document.eof ~i SUB2 =document.eof
263 263
 
264 264
 RTN
... ...
@@ -270,7 +270,7 @@ RTN
270 270
 	$loop NOP
271 271
 		( move ) ~j ~i SUB2 LDR ~j STR
272 272
 		( decr ) ~j #0001 SUB2 =j
273
-		~j ~selection.from GTH2 ^$loop MUL JMPS
273
+		~j ~selection.from GTH2 ^$loop MUL JMP
274 274
 	~document.eof ~i ADD2 =document.eof
275 275
 
276 276
 RTN
... ...
@@ -299,7 +299,7 @@ RTN
299 299
 		~selection.from #0001 SUB2 LDR #0a EQU RTN?
300 300
 		~selection.from #0001 SUB2 LDR #0d EQU RTN?
301 301
 		( decr ) ~selection.from DUP2 =selection.to #0001 SUB2 =selection.from
302
-	~selection.from LDR #00 NEQ ^$loop MUL JMPS
302
+	~selection.from LDR #00 NEQ ^$loop MUL JMP
303 303
 	( clamp at document body )
304 304
 	~selection.from ,document.body GTH2 RTN?
305 305
 	,document.body DUP2 =selection.from #0001 ADD2 =selection.to
... ...
@@ -312,7 +312,7 @@ RTN
312 312
 		~selection.from LDR #0a EQU RTN?
313 313
 		~selection.from LDR #0d EQU RTN?
314 314
 		( incr ) ~selection.from #0001 ADD2 DUP2 #0001 ADD2 =selection.to =selection.from
315
-		~selection.from LDR #00 NEQ ^$loop MUL JMPS
315
+		~selection.from LDR #00 NEQ ^$loop MUL JMP
316 316
 	( clamp at document body )
317 317
 	~selection.from ,document.eof LTH2 RTN?
318 318
 	,document.eof #0001 SUB2 DUP2 =selection.from #0001 ADD2 =selection.to
... ...
@@ -327,7 +327,7 @@ RTN
327 327
 		,$end ~j LDR #20 EQU JMP2?
328 328
 		,$end ~j LDR #0a EQU JMP2?
329 329
 		,$end ~j LDR #0d EQU JMP2?
330
-		~j ,document.body GTH2 ^$loop MUL JMPS
330
+		~j ,document.body GTH2 ^$loop MUL JMP
331 331
 	$end 
332 332
 	( return ) ~j #0001 SUB2
333 333
 
... ...
@@ -341,7 +341,7 @@ RTN
341 341
 		,$end ~j LDR #20 EQU JMP2?
342 342
 		,$end ~j LDR #0a EQU JMP2?
343 343
 		,$end ~j LDR #0d EQU JMP2?
344
-		~j ,document.body GTH2 ^$loop MUL JMPS
344
+		~j ,document.body GTH2 ^$loop MUL JMP
345 345
 	$end 
346 346
 	( return ) ~j #0001 ADD2
347 347
 
... ...
@@ -354,7 +354,7 @@ RTN
354 354
 		( incr ) ~j #0001 ADD2 =j
355 355
 		,$end ~selection.from ~j SUB2 LDR #0a EQU JMP2?
356 356
 		,$end ~selection.from ~j SUB2 LDR #0d EQU JMP2?
357
-		~selection.from ~j SUB2 ,document.body GTH2 ^$loop MUL JMPS
357
+		~selection.from ~j SUB2 ,document.body GTH2 ^$loop MUL JMP
358 358
 	$end 
359 359
 	( return ) ~j
360 360
 
... ...
@@ -369,7 +369,7 @@ RTN
369 369
 			( incr ) ~pt.y #0001 ADD2 =pt.y
370 370
 		$no-space
371 371
 		( incr ) ~j #0001 ADD2 =j
372
-	~j LDR #00 NEQ ^$loop MUL JMPS
372
+	~j LDR #00 NEQ ^$loop MUL JMP
373 373
 	$end
374 374
 	( return ) ~j
375 375
 
... ...
@@ -383,7 +383,7 @@ RTN
383 383
 		,$end ~j ~pt.x ADD2 LDR #0a EQU JMP2?
384 384
 		,$end ~j ~pt.x ADD2 LDR #0d EQU JMP2?
385 385
 		( incr ) ~pt.x #0001 ADD2 =pt.x
386
-		~pt.x ~position.x #0001 SUB2 LTH2 ^$loop MUL JMPS
386
+		~pt.x ~position.x #0001 SUB2 LTH2 ^$loop MUL JMP
387 387
 	$end
388 388
 	( return ) ~pt.x ADD2
389 389
 
... ...
@@ -405,7 +405,7 @@ RTN
405 405
 	$loop NOP
406 406
 		~selection.from ~i ADD2 LDR ,clip.body ~i ADD2 STR
407 407
 		( incr ) ~i #0001 ADD2 =i
408
-		~i ~j LTH2 ^$loop MUL JMPS
408
+		~i ~j LTH2 ^$loop MUL JMP
409 409
 
410 410
 RTN
411 411
 
... ...
@@ -417,7 +417,7 @@ RTN
417 417
 	$loop NOP
418 418
 		,clip.body ~i ADD2 LDR ~selection.from ~i ADD2 STR
419 419
 		( incr ) ~i #0001 ADD2 =i
420
-		~i ~j LTH2 ^$loop MUL JMPS
420
+		~i ~j LTH2 ^$loop MUL JMP
421 421
 
422 422
 RTN
423 423
 
... ...
@@ -512,7 +512,7 @@ RTN
512 512
 			( incr ) ~j #0001 ADD2 =j
513 513
 		$no-break
514 514
 		( incr ) ~textarea.addr #0001 ADD2 =textarea.addr
515
-	~textarea.addr LDR #00 NEQ ^$find-offset MUL JMPS
515
+	~textarea.addr LDR #00 NEQ ^$find-offset MUL JMP
516 516
 	$find-offset-end
517 517
 
518 518
 	#0018 =Sprite.x #0000 =Sprite.y
... ...
@@ -577,7 +577,7 @@ RTN
577 577
 	$loop NOP
578 578
 	( draw ) #08 =Sprite.color
579 579
 	( incr ) ~Sprite.y #0008 ADD2 =Sprite.y
580
-	~Sprite.y ~Screen.height LTH2 ^$loop MUL JMPS
580
+	~Sprite.y ~Screen.height LTH2 ^$loop MUL JMP
581 581
 
582 582
 	#0000 =Sprite.y
583 583
 	,arrowup_icn =Sprite.addr
... ...
@@ -603,7 +603,7 @@ RTN
603 603
 		( draw ) DUP2 LDR #00 SWP #20 SUB #0008 MUL2 ,font ADD2 =Sprite.addr ~label.color =Sprite.color
604 604
 		( incr ) #0001 ADD2
605 605
 		( incr ) ~Sprite.x #0008 ADD2 =Sprite.x
606
-		DUP2 LDR #00 NEQ ^$loop MUL JMPS
606
+		DUP2 LDR #00 NEQ ^$loop MUL JMP
607 607
 	POP2
608 608
 	( selection )
609 609
 	~selection.from ,document.body SUB2 ,draw-short JSR2
... ...
@@ -109,7 +109,7 @@ BRK
109 109
 					~MOUS.y ~bankview.y SUB2 #0008 DIV2 #0008 MUL2 #0010 MUL2 ADD2
110 110
 					~bankview.addr ADD2 #00 ~i ADD2 STR
111 111
 					( incr ) ~i #01 ADD =i
112
-					~i #08 LTH ^copy-loop MUL JMPS
112
+					~i #08 LTH ^copy-loop MUL JMP
113 113
 				,redraw JSR2 ,click-end JMP2
114 114
 			@not-copy-mode
115 115
 
... ...
@@ -122,7 +122,7 @@ BRK
122 122
 					~MOUS.y ~bankview.y SUB2 #0008 DIV2 #0008 MUL2 #0010 MUL2 ADD2
123 123
 					~bankview.addr ADD2 #00 ~i ADD2 STR
124 124
 					( incr ) ~i #01 ADD =i
125
-					~i #08 LTH ^erase-loop MUL JMPS
125
+					~i #08 LTH ^erase-loop MUL JMP
126 126
 				,redraw JSR2 ,click-end JMP2
127 127
 			@not-erase-mode
128 128
 
... ...
@@ -460,13 +460,13 @@ RTN
460 460
 		( incr ) ~SCRN.x #0001 ADD2 =SCRN.x
461 461
 		( draw ) ~rect.y1 =SCRN.y ~color =SCRN.color
462 462
 		( draw ) ~rect.y2 =SCRN.y ~color =SCRN.color
463
-		~SCRN.x ~rect.x2 LTH2 ^$hor MUL JMPS
463
+		~SCRN.x ~rect.x2 LTH2 ^$hor MUL JMP
464 464
 	~rect.y1 =SCRN.y
465 465
 	$ver NOP
466 466
 		( draw ) ~rect.x1 =SCRN.x ~color =SCRN.color
467 467
 		( draw ) ~rect.x2 =SCRN.x ~color =SCRN.color
468 468
 		( incr ) ~SCRN.y #0001 ADD2 =SCRN.y
469
-		~SCRN.y ~rect.y2 #0001 ADD2 LTH2 ^$ver MUL JMPS
469
+		~SCRN.y ~rect.y2 #0001 ADD2 LTH2 ^$ver MUL JMP
470 470
 
471 471
 RTN
472 472
 
... ...
@@ -1,16 +1,27 @@
1 1
 ( tests/cond )
2 2
 
3
+%RTN { RSW2 JMP2 }
4
+%RTN? { CLN2 JMP2? }
5
+
3 6
 |0100 @RESET 
4 7
 
5 8
 	#00 #d0
9
+
6 10
 	$loop NOP
7 11
 		( incr ) SWP #01 ADD SWP 
8
-		DUP2 LTH ^$loop SWP JMPS?
12
+		DUP2 LTH ^$loop SWP JMP?
9 13
 	POP =Console.byte
10 14
 
15
+	,routine JSR2
16
+
11 17
 BRK
12 18
 
13 19
 @routine
20
+
21
+
22
+	CLN2 JMP2
23
+
24
+	#aa
14 25
 	
15 26
 
16 27
 RTN
... ...
@@ -12,12 +12,12 @@ BRK
12 12
 	( should print 11, 22, 33, 44 )
13 13
 
14 14
 	#11 =Console.byte
15
-	#03 JMPS BRK BRK BRK 
15
+	#03 JMP BRK BRK BRK 
16 16
 
17 17
 	( skip foward with id )
18 18
 
19 19
 	#22 =Console.byte
20
-	^jump JMPS BRK BRK BRK @jump
20
+	^jump JMP BRK BRK BRK @jump
21 21
 
22 22
 	( skip patterns )
23 23
 
... ...
@@ -27,7 +27,7 @@ BRK
27 27
 		#ff =Console.byte
28 28
 	@skip1
29 29
 
30
-	#12 #34 LTH ^skip2 #04 SUB MUL JMPS
30
+	#12 #34 LTH ^skip2 #04 SUB MUL JMP
31 31
 		#ff =Console.byte
32 32
 	@skip2
33 33
 
... ...
@@ -41,9 +41,9 @@ RTN
41 41
 
42 42
 	( should print aa, bb, cc, dd )
43 43
 
44
-	@label1 #aa =Console.byte ^label3 JMPS
45
-	@label2 #cc =Console.byte ^label4 JMPS
46
-	@label3 #bb =Console.byte ^label2 JMPS
44
+	@label1 #aa =Console.byte ^label3 JMP
45
+	@label2 #cc =Console.byte ^label4 JMP
46
+	@label3 #bb =Console.byte ^label2 JMP
47 47
 	@label4 #dd =Console.byte BRK
48 48
 
49 49
 	@end
... ...
@@ -16,7 +16,7 @@ BRK
16 16
 
17 17
 	$loop NOP
18 18
 		~a #01 ADD =a
19
-		~a #d0 LTH ^$loop MUL JMPS
19
+		~a #d0 LTH ^$loop MUL JMP
20 20
 	~a =Console.byte
21 21
 
22 22
 RTN
... ...
@@ -34,7 +34,7 @@ RTN
34 34
 
35 35
 	$loop NOP
36 36
 		~c #01 ADD =c
37
-		~c #d0 LTH ^$loop SWP JMPS?
37
+		~c #d0 LTH ^$loop SWP JMP?
38 38
 	~c =Console.byte 
39 39
 
40 40
 RTN
... ...
@@ -44,7 +44,7 @@ RTN
44 44
 	#00 #d0
45 45
 	$loop NOP
46 46
 		( incr ) SWP #01 ADD SWP 
47
-		DUP2 LTH ^$loop SWP JMPS?
47
+		DUP2 LTH ^$loop SWP JMP?
48 48
 	POP =Console.byte
49 49
 
50 50
 RTN
... ...
@@ -54,7 +54,7 @@ RTN
54 54
 	#0000 #0d00
55 55
 	$loop NOP
56 56
 		( incr ) SWP2 #0001 ADD2 SWP2
57
-		OVR2 OVR2 LTH2 ^$loop SWP JMPS?
57
+		OVR2 OVR2 LTH2 ^$loop SWP JMP?
58 58
 	POP2 =Console.short
59 59
 
60 60
 RTN
... ...
@@ -33,9 +33,8 @@ Uint16 peek16(Stack *s, Uint8 a) { return peek8(s, a * 2) + (peek8(s, a * 2 + 1)
33 33
 void op_brk(Uxn *u) { setflag(&u->status, FLAG_HALT, 1); }
34 34
 void op_lit(Uxn *u) { u->literal += 1; }
35 35
 void op_nop(Uxn *u) { (void)u; }
36
-void op_jmp(Uxn *u) { Uint8 a = pop8(&u->wst); u->ram.ptr += getflag(&u->status, FLAG_SIGN) ? (Sint8)a : a; }
37
-
38
-void op_jsr(Uxn *u) { Uint8 a = pop8(&u->wst); push16(&u->rst, u->ram.ptr); u->ram.ptr += getflag(&u->status, FLAG_SIGN) ? (Sint8)a : a; }
36
+void op_jmp(Uxn *u) { Uint8 a = pop8(&u->wst); u->ram.ptr += (Sint8)a; }
37
+void op_jsr(Uxn *u) { Uint8 a = pop8(&u->wst); push16(&u->rst, u->ram.ptr); u->ram.ptr += (Sint8)a; }
39 38
 void op_rtn(Uxn *u) { u->ram.ptr = pop16(&u->rst); }
40 39
 void op_ldr(Uxn *u) { Uint16 a = pop16(&u->wst); push8(&u->wst, mempeek8(u, a)); }
41 40
 void op_str(Uxn *u) { Uint16 a = pop16(&u->wst); Uint8 b = pop8(&u->wst); mempoke8(u, a, b); }
... ...
@@ -50,6 +49,7 @@ void op_dup(Uxn *u) { push8(&u->wst, peek8(&u->wst, 0)); }
50 49
 void op_swp(Uxn *u) { Uint8 b = pop8(&u->wst), a = pop8(&u->wst); push8(&u->wst, b); push8(&u->wst, a); }
51 50
 void op_ovr(Uxn *u) { push8(&u->wst, peek8(&u->wst, 1)); }
52 51
 void op_rot(Uxn *u) { Uint8 c = pop8(&u->wst), b = pop8(&u->wst), a = pop8(&u->wst); push8(&u->wst, b); push8(&u->wst, c); push8(&u->wst, a); }
52
+void op_cln(Uxn *u) { push8(&u->wst, peek8(&u->rst, 0)); }
53 53
 void op_wsr(Uxn *u) { Uint8 a = pop8(&u->wst); push8(&u->rst, a); }
54 54
 void op_rsw(Uxn *u) { Uint8 a = pop8(&u->rst); push8(&u->wst, a); }
55 55
 /* Arithmetic */
... ...
@@ -78,6 +78,7 @@ void op_dup16(Uxn *u) { push16(&u->wst, peek16(&u->wst, 0)); }
78 78
 void op_swp16(Uxn *u) { Uint16 b = pop16(&u->wst), a = pop16(&u->wst); push16(&u->wst, b); push16(&u->wst, a); }
79 79
 void op_ovr16(Uxn *u) { push16(&u->wst, peek16(&u->wst, 1)); }
80 80
 void op_rot16(Uxn *u) { Uint16 c = pop16(&u->wst), b = pop16(&u->wst), a = pop16(&u->wst); push16(&u->wst, b); push16(&u->wst, c); push16(&u->wst, a); }
81
+void op_cln16(Uxn *u) { push16(&u->wst, peek16(&u->rst, 0)); }
81 82
 void op_wsr16(Uxn *u) { Uint16 a = pop16(&u->wst); push16(&u->rst, a); }
82 83
 void op_rsw16(Uxn *u) { Uint16 a = pop16(&u->rst); push16(&u->wst, a); }
83 84
 /* Arithmetic(16-bits) */
... ...
@@ -93,12 +94,12 @@ void op_lth16(Uxn *u) { Uint16 a = pop16(&u->wst), b = pop16(&u->wst); push8(&u-
93 94
 void (*ops[])(Uxn *u) = {
94 95
 	op_brk, op_nop, op_lit, op_ldr, op_str, op_jmp, op_jsr, op_rtn, 
95 96
 	op_equ, op_neq, op_gth, op_lth, op_and, op_xor, op_rol, op_ror, 
96
-	op_pop, op_dup, op_swp, op_ovr, op_rot, op_nop, op_wsr, op_rsw,
97
+	op_pop, op_dup, op_swp, op_ovr, op_rot, op_cln, op_wsr, op_rsw,
97 98
 	op_add, op_sub, op_mul, op_div, op_nop, op_nop, op_nop, op_nop,
98 99
 	/* 16-bit */
99 100
 	op_brk,   op_nop16, op_lit16, op_ldr16, op_str16, op_jmp16, op_jsr16, op_rtn,
100 101
 	op_equ16, op_neq16, op_gth16, op_lth16, op_and16, op_xor16, op_rol16, op_ror16, 
101
-	op_pop16, op_dup16, op_swp16, op_ovr16, op_rot16, op_nop,   op_wsr16, op_rsw16,
102
+	op_pop16, op_dup16, op_swp16, op_ovr16, op_rot16, op_cln16, op_wsr16, op_rsw16,
102 103
 	op_add16, op_sub16, op_mul16, op_div16, op_nop,   op_nop,   op_nop,   op_nop
103 104
 };
104 105
 
... ...
@@ -155,7 +156,7 @@ opcuxn(Uxn *u, Uint8 instr)
155 156
 		return haltuxn(u, "Return-stack overflow", instr);
156 157
 	if(!fcond || (fcond && pop8(&u->wst)))
157 158
 		(*ops[op])(u);
158
-	else if(opr[op][0] >= opr[op][1])
159
+	else
159 160
 		u->wst.ptr -= opr[op][0] - opr[op][1];
160 161
 	return 1;
161 162
 }