Nand2tetris-project-04
I/O处理程序(Fill.asm)
屏幕对应RAM基地址16384-24575
键盘对应RAM基地址24576
程序通过无限循环监测键盘输入,即地址24576存储的值,若为0,则说明没有键按下,跳转至CLEAR功能;若大于0,则说明有键按下,跳转至FILL功能。
FILL:在开始填黑前,判断屏幕是否已经全部变黑,变黑则直接进入下一次循环;每次循环只填充一个地址,填充只需将-1存入该地址(-1的补码为全1),填充完后将R0存储的当前地址+1,进入下一轮训环。
CLEAR:首先判断屏幕是否为空屏,为空屏则直接进入下一轮循环;不为空就进行清屏操作,M = 0,然后再将R0中存储的当前地址-1,进入下一轮循环。
预定义符号:
SCREEN:指针
KED:键盘
//将当前地址存储R0
@SCREEN
D = A
@0
M = D
//将屏幕最大地址存入R1
@24575
D = A
@1
M = D
//一个无限循环,监测键盘输入
(LOOP)
@KBD
D = M
//根据D判断填入还是清屏
@FILL
D;JGT
@CLEAR
0;JMP
//实现FILL功能
(FILL)
@0
D = M
@1
D = D - M
@LOOP
D;JGT //如果当前地址大于最大地址,说明屏满,开始下一次循环
@0
D = M
A = D
M = -1
@0
M = D + 1
@LOOP
0;JMP //每次循环填充一个地址,填充完后开始下一次循环
//实现CLEAR功能
(CLEAR)
@0
D = M
@SCREEN
D = D - A
@LOOP
D;JLT //如果已经是空屏,直接开始下一次循环
@0
D = M
A = D
M = 0
@0
M = D - 1
@LOOP
0;JMP