16位汇编模拟器中实现十六进制色值彩虹渐变对角线的方法
16位汇编模拟器彩虹渐变绘制方案
问题原因
你当前代码的渐变异常是因为调色板默认按「B分量→G分量→R分量」的优先级递增排列,直接对颜色下标+1得到的是蓝色调先渐变、再绿色调、最后红色调的序列,不符合彩虹「红→橙→黄→绿→青→蓝→紫」的渐变逻辑。
实现方案
我们可以预先定义符合彩虹渐变顺序的调色板下标序列,绘制时依次读取序列值写入显存即可,修改后的代码如下:
colourDisplay EQU 0x300 ; 显存起始地址 rainbow_len EQU 16 ; 渐变颜色数量 bboot: MOV D, colourDisplay ; D寄存器指向显存起始位置 MOV SI, rainbow_colors ; SI指向彩虹颜色序列首地址 MOV C, rainbow_len ; C作为计数器,存放颜色总数 JMP print print: MOVB BL, [SI] ; 从序列中读取当前颜色下标 MOVB [D], BL ; 写入显存绘制点 ADD D, 17 ; 对角线步长(每行16像素,+17就是下一行同偏移位置) ADD SI, 1 ; 移动到下一个颜色值 DEC C ; 计数器减1 JNZ print ; 未绘制完则继续 HLT ; 彩虹渐变调色板下标序列,可按需调整增减过渡色 rainbow_colors: DB 0xE0, 0xE8, 0xF0, 0xF8, 0x78, 0x38, 0x1F, 0x17 DB 0x0F, 0x07, 0x27, 0x47, 0x67, 0xA7, 0xC7, 0xE7
效果说明
上面的序列已经按照彩虹渐变的逻辑调整了颜色顺序,运行后即可得到连续的彩虹对角线效果,你也可以根据自己的需求修改rainbow_colors中的下标值调整渐变过渡的细腻程度,或者修改ADD D, 1改为绘制水平/垂直直线等其他形状。
内容的提问来源于stack exchange,提问作者lLauriix
相关产品推荐
相关产品推荐

