跳转到内容

TI 83 Plus 汇编/高级

来自维基教科书,开放世界开放书籍

高级 z80 编程技术

[编辑 | 编辑源代码]

什么是中断?

[编辑 | 编辑源代码]

中断类型

[编辑 | 编辑源代码]

如何编写它们

[编辑 | 编辑源代码]

如何安装它们

[编辑 | 编辑源代码]
跳转表
[编辑 | 编辑源代码]

直接 LCD 交互

[编辑 | 编辑源代码]

端口 $10

[编辑 | 编辑源代码]

端口 $11

[编辑 | 编辑源代码]

将累加器 (A) 设置为零的常用快捷方式是将其与自身异或

 ; instead of doing this
   ld a,0
 ; you can do this
   xor a

这非常普遍,不会影响代码的可读性。事实上,它如此常见,以至于它甚至可能比使用“ld a,0”更具可读性。但请注意,“xor a”会修改标志(例如,它会设置 z 标志并重置进位),而“ld a,0”不会修改任何标志。

ld (addr),reg16

[编辑 | 编辑源代码]

在向内存中的两个连续字节写入数据时,使用一个 16 位寄存器通常比使用两个带 a 的加载指令更快且更小。

 ; rather than
   ld a,$10
   ld (penCol),a
   ld a,$20
   ld (penCol),a
 ; you can do
   ld de,$2010
   ld (penCol),de

这将 e 加载到 (penCol) 中,并将 d 加载到 (penCol+1) 中。penCol+1 是 penRow。但是,请记住,使用 hl 读取/写入内存地址比使用 de/bc 更快(4 个 t 状态)且更小。

X <= A <= Y

[编辑 | 编辑源代码]

如果您想知道累加器值是否在其他两个值(例如 10 和 25)之间,您可能会想做类似这样的事情

   cp 10      ; check if a >= 10
    jr c,wrongValue
   cp 26      ; check if a <= 25
    jr nc,wrongValue
 ; do whatever you wanted to do
 wrongValue:
 ; ...

但是,您无需进行两次比较和跳转,可以将第一个 cp 更改为减法。这将任何小于 10 的数字转换为负数。例如

   sub 10      ; a value of 10 now equals 0
   cp 26-10    ; because of the sub 10, we now need to check if a is between 0 and 16, not 10 and 26
    jr nc,wrongValue
 ; do whatever you wanted to do
 wrongValue:
 ; ...

这种方法可以避免第一个 jr。

华夏公益教科书