M README.md => README.md +1 -1
@@ 31,7 31,7 @@ To display the list of operators inside of Orca, use `CmdOrCtrl+G`.
- `E` **east**: Moves eastward, or bangs.
- `F` **if**(*a* b): Bangs if inputs are equal.
- `G` **generator**(*x* *y* *len*): Writes operands with offset.
-- `H` **halt**: Halts southward operand.
+- `H` **hold**: Holds southward operand.
- `I` **increment**(*step* mod): Increments southward operand.
- `J` **jumper**(*val*): Outputs northward operand.
- `K` **konkat**(*len*): Reads multiple variables.
M src/main.tal => src/main.tal +26 -21
@@ 34,9 34,6 @@
%GET-PORT-LEFT { DUP2 PORTEL-TYPE SET-TYPE GET-CELL GET-VALUE } ( x y -- char )
%GET-PORT-RIGHT { DUP2 PORTER-TYPE SET-TYPE DUP2 #01 SET-LOCK GET-CELL GET-VALUE } ( x y -- char )
%GET-PORT-RIGHT-RAW { DUP2 PORTER-TYPE SET-TYPE DUP2 #01 SET-LOCK GET-CELL } ( x y -- char )
-%SET-PORT-OUTPUT { STH DUP2 OUTPUT-TYPE SET-TYPE DUP2 #01 SET-LOCK STHr SET-CELL } ( x y char -- )
-%LOAD-CASE { GET-CELL IS-UC } ( x y -- uc )
-%SAVE-CASE { DUP #60 > STHr 20* * - } ( char uc -- char )
( devices )
@@ 1039,25 1036,33 @@ RTN
@op-z ( x y char -- ) ( TODO )
- POP
- ( get case ) DUP2 [ SWP INC SWP ] LOAD-CASE STH
- ( get rate ) DUP2 [ SWP #01 - SWP ] GET-PORT-LEFT STH
- ( get target ) DUP2 [ SWP INC SWP ] GET-PORT-RIGHT STH
- ( incr y ) INC
- ( get val ) DUP2 GET-CELL GET-VALUE STH
- EQUkr STHr ,&end JCN
- LTHkr STHr #00 ! ,&no-below JCN
- ( val rate + ) STHr OVRr STH SWPr ADDr
- ( clamp ) GTHkr STHr SWPr?
- ,&end JMP
- &no-below
- GTHkr STHr #00 ! ,&no-above JCN
- ( val rate - ) STHr OVRr STH SWPr SUBr
- ( clamp ) LTHkr STHr SWPr?
- &no-above
- &end
- STHr GET-CHAR POP2r SAVE-CASE SET-PORT-OUTPUT
+ POP POP2
+ .head/addr LDZ2 STH2k
+ ( rate ) DEC2 ;get-port-left-value JSR2
+ ( target ) STH2kr INC2 ;get-port-right-raw JSR2
+ ( get case ) DUP IS-UC ,&case STR
+ ( to value ) GET-VALUE
+ ( val ) STH2kr BELOW [ DATA-CELLS ++ LDA GET-VALUE ]
+ ( res ) ;lerp JSR2
+ ( set case ) GET-CHAR DUP #60 > [ LIT &case $1 ] AND 20* -
+ ( output ) STH2r BELOW ;set-port-output JSR2
+
+RTN
+
+@lerp ( rate target val -- val )
+ DUP2 DIF STH
+ ( if rate > target )
+ ROT DUP STHr < ,&skip JCN
+ POP2 RTN
+ &skip
+ ( target val rate )
+ STH
+ GTHk ,&no-below JCN
+ NIP STHr SUB RTN
+ &no-below
+ NIP STHr ADD
+
RTN
@op-bang ( x y char -- )
M src/utils.tal => src/utils.tal +1 -0
@@ 18,6 18,7 @@
%8MOD { #07 AND } %8MOD2 { #0007 AND2 }
%10MOD { #0f AND } %10MOD2 { #000f AND2 }
+%DIF { GTHk JMP SWP SUB }
%MOD { DIVk MUL SUB }
%MOD2 { DIV2k MUL2 SUB2 }
%MIN { LTHk JMP SWP POP }