特殊指令
-
脉冲发生指令gen P X Y,相当于
mov 100 P slp X mov 0 P slp Y
其中X和Y都可以取0。
-
初始化标记@,在语句开头添加@,则该语句仅在第一次运行时执行。
-
占位指令nop可以用来同步不同部件的读写时机。
XBus和简单I/O的行为
-
简单输出写入一次后不需要继续写入,自动维持原值。
-
当XBus读写同步时,可以略去读数据方的slx语句。
-
XBus读写时,接收方在sleep会引起阻塞。
-
简单I/O可以广播。
-
可以用XBus收发来控制不同部件执行的顺序。如可以让需要先执行的部件执行完后发送信息到下一个部件,在下一个部件程序开始设置需要接收上一个部件的信息。
-
slx不一定和“消耗”数据的指令配合使用,只要同一条数据线上有数据经过,整条线上连接的所有元件的下一个slx指令都会激活。
-
非阻塞式XBus如果没有把当前数据读完,下一次会接着上一次没读完的位置读。如下图。很容易引起bug。
下一次再读得到的值是361
内存行为
-
可读写内存的写指针和读指针都是自增且自动循环的。当写入和读出的数据长度相等时,不必每次都手动置0,任其自然循环即可保证写入和读出一一对应。
-
可读写内存的地址XBus控制的是与其同侧的数据Xbus的地址。
-
内存地址自动对14取模。即,如果输入地址15,则指针指向1。注意,1,10,11,100,101,110,111模14各不同。
-
读写在两侧时,可以通过看写内存地址和读内存地址的关系看是否全部读完已经写入的部分。
-
当数据的值范围在0-9时,可以通过dst编码后储存节省内存空间。
桥接器用法与联通性
使用桥接器可以实现线路交叉 1和1联通,2和2联通,3a和3b联通 对应的接线
排线技巧
后期谜题因为电路板空间有限,需要注意排线。排线前事先想好程序流程,确定需要的元件的种类和数量,每个元件需要联通几个P几个X,根据这些信息进行布局。
分支语句行为
进行teq,tgt,tlt,tcp等操作后,决定分支行为的是内部状态寄存器的符号。内部状态寄存器只有一个,每次执行新比较操作后,状态会被覆盖。所以当存在多重比较操作时,带符号语句的顺序很重要。合理优化后可能用更少的代码行数实现同样的逻辑。
- 分支行为取决于内部状态寄存器当前的状态。下例中,当p0大于等于100时,mov 1 acc和mov 2 acc都会被执行,于是当p0为大于等于80小于100的数时,执行结果和当p0为大于等于100的数时相同。
如果要达到if…else if的效果,则需要加入跳转。下例中,当p0大于等于100时,执行完mov 1 acc就跳到后续语句,不再执行mov 2 acc,于是当p0为大于等于80小于100的数时,执行结果和当p0为大于等于100的数时不同。tlt p0 100 - mov 1 acc + tlt p0 80 - mov 2 acc
tlt p0 100 - mov 1 acc - jmp f + tlt p0 80 - mov 2 acc f:......
- 只要内部状态寄存器没有被重写入,则插入一些不带符号的语句后,上次判定仍然有效。如下例中,决定执行sub 1还是add 1的,仍然是tgt acc 0的结果。
tgt acc 0 + gen p1 0 1 - gen p1 1 0 mov 50 p1 slp 1 + sub 1 - add 1
PGA33X6的用法
参考这个录像。
SHENZHEN Solitaire技巧
-
尽快把各个花色的1都翻出来。
-
尽快把“中”,“发”和方块都清除掉。