这是课程作业mult.asm和fill.asm
mult.asm的作用是计算R0×R1,保存到R2中。
// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.)
fill.asm作用是,当键盘上有键被按下时,将整个屏幕变为黑色,松开变为白色
乘法
计算R0×R1,保存到R2中
参考mult.asm,做了小改动,加了点注释:
// 3*2 换算成 2个3相加
// 初始化
@R2
M = 0
// 判断是否小于0,小于0不计算,直接跳到结束位置
@R0
D = M
@END
D;JLT
(LOOP)
@R1
M = M - 1 // R1控制循环次数
D = M
@END
D;JLT
@R0
D = M
@R2
M = M + D // 每次循环把R0加到R2中
@LOOP
0;JMP
(END)
@END
0;JMP
键盘屏幕操作
在屏幕上从上到下一行一行地填充,画的过程很慢(不是程序有问题)
参考Fill.asm:
// 24576为键盘的地址 16384-24575 刚好8K 为屏幕的地址
@24575 // 取屏幕的最后一个地址
D = A
@R0 // 存到R0中
M = D
@SCREEN
D = A
@R1 // R1存储屏幕当前地址,从SCREEN开始递增
M = D
(LOOP)
@KBD
D = M // 取KBD内容
@FILL
D;JGT // KBD被按下时非零,跳到FILL填充屏幕
@CLEAR // KBD没有按下时,跳到CLEAR清屏
0;JMP
(FILL)
// 判断屏幕是否为满,单次LOOP循环只填充一个寄存器,FILL中没有循环,可以实现快速响应,以免KBD松开后还在填充
@R0
D = M
@R1
D = D - M // R0-R1
@LOOP
D;JLT // R0-R1值是否小于0,如果小于,说明R1已经从屏幕起始累加到了R0
@R1
D = M // 缓存当前地址
A = M // 将当前地址推入A
M = -1 // 将地址对应的屏幕位置变黑
@R1 // R1,也即当前地址+1
M = D + 1
@LOOP
0;JMP
(CLEAR)
// 判断屏幕是否为空,如果已经是空的,也就不用清屏,直接回到LOOP,此时当前位置R1是
@SCREEN
D = A
@R1
D = D - M
@LOOP
D;JGT
@R1
// 缓存当前地址
D = M
// 将当前地址推入A
A = M
// 将地址对应的屏幕位置变白
M = 0
// 当前地址-1
@R1
M = D - 1
@LOOP
0;JMP