... | ... |
@@ -46,7 +46,7 @@ BRK |
46 | 46 |
,no-click ~Mouse.state #00 EQU JMP2? |
47 | 47 |
|
48 | 48 |
( load ) ~editor.addr ~Mouse.y ~editor.y1 SUB2 #0008 DIV2 ADD2 LDR |
49 |
- ( mask ) #01 #07 ~Mouse.x ~editor.x1 SUB2 #0008 DIV2 SWP POP SUB SHL |
|
49 |
+ ( mask ) #01 #07 ~Mouse.x ~editor.x1 SUB2 #0008 DIV2 SWP POP SUB #40 SFT SFT |
|
50 | 50 |
ORA |
51 | 51 |
( save ) ~editor.addr ~Mouse.y ~editor.y1 SUB2 #0008 DIV2 ADD2 STR |
52 | 52 |
|
... | ... |
@@ -14,6 +14,7 @@ |
14 | 14 |
%2/ { #0001 SFT2 } %2* { #0001 SHL2 } |
15 | 15 |
%8/ { #0003 SFT2 } %8* { #0003 SHL2 } |
16 | 16 |
%8- { #0008 SUB2 } %8+ { #0008 ADD2 } |
17 |
+%SFL { #40 SFT SFT } |
|
17 | 18 |
|
18 | 19 |
;bankview { x 2 y 2 mode 1 addr 2 } |
19 | 20 |
;tileview { x 2 y 2 addr 2 } |
... | ... |
@@ -156,13 +157,13 @@ BRK |
156 | 157 |
~MOUS.y ~tileview.y SUB2 ~MOUS.y ~tileview.y SUB2 #0040 DIV2 #0040 MUL2 SUB2 =pos.y |
157 | 158 |
,no-erase-mode ~bankview.mode #02 NEQ JMP2? |
158 | 159 |
( load ) ~addr ~pos.y 8/ ADD2 LDR |
159 |
- ( mask ) #01 #07 ~pos.x 8/ SWP POP SUB SHL |
|
160 |
+ ( mask ) #01 #07 ~pos.x 8/ SWP POP SUB SFL |
|
160 | 161 |
#ff XOR AND |
161 | 162 |
( save ) ~addr ~pos.y 8/ ADD2 STR |
162 | 163 |
,redraw JSR2 ,click-end JMP2 |
163 | 164 |
@no-erase-mode |
164 | 165 |
( load ) ~addr ~pos.y 8/ ADD2 LDR |
165 |
- ( mask ) #01 #07 ~pos.x 8/ SWP POP SUB SHL |
|
166 |
+ ( mask ) #01 #07 ~pos.x 8/ SWP POP SUB SFL |
|
166 | 167 |
ORA |
167 | 168 |
( save ) ~addr ~pos.y 8/ ADD2 STR |
168 | 169 |
,redraw JSR2 ,click-end JMP2 |
... | ... |
@@ -25,6 +25,7 @@ |
25 | 25 |
%8/ { #0003 SFT2 } %8* { #0003 SHL2 } |
26 | 26 |
%8+ { #0008 ADD2 } |
27 | 27 |
%MOD8 { #0007 AND2 } |
28 |
+%SFL { #40 SFT SFT } |
|
28 | 29 |
|
29 | 30 |
;center { x 2 y 2 } |
30 | 31 |
;toolbar { x1 2 y1 2 x2 2 y2 2 } |
... | ... |
@@ -345,7 +346,7 @@ RTN |
345 | 346 |
=pt1.y =pt1.x |
346 | 347 |
( get tile addr ) ,data ~pt1.x 8/ ~pt1.y 8/ ~canvas.w MUL2 ADD2 8* ~pt1.y MOD8 ADD2 ADD2 |
347 | 348 |
( load ) DUP2 LDR |
348 |
- ( mask ) #01 #07 ~pt1.x MOD8 SWP POP SUB SHL ORA |
|
349 |
+ ( mask ) #01 #07 ~pt1.x MOD8 SWP POP SUB SFL ORA |
|
349 | 350 |
( save ) ROT ROT STR |
350 | 351 |
|
351 | 352 |
RTN |
... | ... |
@@ -355,7 +356,7 @@ RTN |
355 | 356 |
=pt1.y =pt1.x |
356 | 357 |
( get tile addr ) ,data ~pt1.x 8/ ~pt1.y 8/ ~canvas.w MUL2 ADD2 8* ~pt1.y MOD8 ADD2 ADD2 |
357 | 358 |
( load ) DUP2 LDR |
358 |
- ( mask ) #01 #07 ~pt1.x MOD8 SWP POP SUB SHL #ff XOR AND |
|
359 |
+ ( mask ) #01 #07 ~pt1.x MOD8 SWP POP SUB SFL #ff XOR AND |
|
359 | 360 |
( save ) ROT ROT STR |
360 | 361 |
|
361 | 362 |
RTN |
... | ... |
@@ -42,7 +42,11 @@ void op_and(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b |
42 | 42 |
void op_ora(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b | a); } |
43 | 43 |
void op_xor(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b ^ a); } |
44 | 44 |
void op_shl(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b << (a % 8)); } |
45 |
-void op_shr(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b >> (a % 8)); } |
|
45 |
+void op_sft(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); |
|
46 |
+ Uint8 left = (a & 0xf0) >> 4; |
|
47 |
+ Uint8 right = (a & 0x0f); |
|
48 |
+ push8(u->src, b << (left % 8) >> (right % 8)); |
|
49 |
+} |
|
46 | 50 |
/* Stack */ |
47 | 51 |
void op_pop(Uxn *u) { pop8(u->src); } |
48 | 52 |
void op_dup(Uxn *u) { push8(u->src, peek8(u->src, 0)); } |
... | ... |
@@ -71,7 +75,7 @@ void op_and16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push16(u->s |
71 | 75 |
void op_ora16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push16(u->src, b | a); } |
72 | 76 |
void op_xor16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push16(u->src, b ^ a); } |
73 | 77 |
void op_shl16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push16(u->src, b << (a % 16)); } |
74 |
-void op_shr16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push16(u->src, b >> (a % 16)); } |
|
78 |
+void op_sft16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push16(u->src, b >> (a % 16)); } |
|
75 | 79 |
/* Stack(16-bits) */ |
76 | 80 |
void op_pop16(Uxn *u) { pop16(u->src); } |
77 | 81 |
void op_dup16(Uxn *u) { push16(u->src, peek16(u->src, 0)); } |
... | ... |
@@ -92,12 +96,12 @@ void op_lth16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push8(u->sr |
92 | 96 |
|
93 | 97 |
void (*ops[])(Uxn *u) = { |
94 | 98 |
op_brk, op_nop, op_lit, op_ldr, op_str, op_nop, op_jmp, op_jsr, |
95 |
- op_equ, op_neq, op_gth, op_lth, op_and, op_ora, op_shl, op_shr, |
|
99 |
+ op_equ, op_neq, op_gth, op_lth, op_and, op_ora, op_shl, op_sft, |
|
96 | 100 |
op_pop, op_dup, op_swp, op_ovr, op_rot, op_nop, op_cln, op_sth, |
97 | 101 |
op_add, op_sub, op_mul, op_div, op_nop, op_nop, op_nop, op_xor, |
98 | 102 |
/* 16-bit */ |
99 | 103 |
op_brk, op_nop16, op_lit16, op_ldr16, op_str16, op_nop, op_jmp16, op_jsr16, |
100 |
- op_equ16, op_neq16, op_gth16, op_lth16, op_and16, op_ora16, op_shl16, op_shr16, |
|
104 |
+ op_equ16, op_neq16, op_gth16, op_lth16, op_and16, op_ora16, op_shl16, op_sft16, |
|
101 | 105 |
op_pop16, op_dup16, op_swp16, op_ovr16, op_rot16, op_nop, op_cln16, op_sth16, |
102 | 106 |
op_add16, op_sub16, op_mul16, op_div16, op_nop, op_nop, op_nop, op_xor16 |
103 | 107 |
}; |