NEXT1
104: CALL MOVDATA ;SET BUFFERS
105: CALL SETDLT ;SET INCREMENT
106: NXT01:
107: CALL DOTUP
108: LOOP NXT01
109: CALL XORDOT ;SET NEW DOT
110: CALL XYDISP ;DISP NEW XXX,YYY
111: JMP PP1
112: NEXT1:
113: CMP AX,5000H ;↓键
114: JNE NEXT2
115: CALL MOVDATA ;SET BUFFERS
116: CALL SETDLT ;SET INCREMENT
117: NXT02:
118: CALL DOTDOWN
119: LOOP NXT02
120: CALL XORDOT ;SET NEW DOT
121: CALL XYDISP ;DISP NEW XXX,YYY
122: JMP PP1
123: NEXT2:
124: CMP AX,4B00H ;←键
125: JNE NEXT3
…
这段程式总共要检查八次,才能确定是否有游标移动以及哪个游标在移动。然后,还要一一检查其他变化,共有十八种有效码。我实在佩服这种程式师,不但有无比的耐性,还有非凡的想像力,居然能把一段极为简单平凡的程式,写得这样的精彩动人!
如果是我,我会写得毫无趣味:
100: PP1: SUB AH,AH
101: INT 16H
102: OR AL,AL
103: JNZ PP1 ;AL 非0无效
104: MOV BH,AL
105: MOV BL,AH
106: SUB BL,47H ;最小之字标键
107: JLE PP1 ;非处理范围
108: SHL BX,1
109: CALL FUNC[BX]
110: JMP PP1
这是主流程,程式短,速度快,维护容易,一眼看过去,有什么错误立刻分明。
…
1000: FUNC DW NEXT02 ;↖
1001: DW NEXT0 ;↑
1002: DW NEXT04 ;↗
1003: DW PPRET ;无效
1004: DW NEXT2 ;←
1005: DW PPRET ;无效
1006: DW NEXT4 ;→
1007: DW PPRET ;无效
1008: DW NEXT12 ;↙
1009: DW NEXT1 ;↓
1010: DW NEXT14 ;↘
…
因为这是子程式,加一段、减一段容易非常。
即使是子程式,也有很大的考究,就以前段来说,在 104至110 之间,就值得三思。
104: CALL MOVDATA ;SET BUFFERS
105: CALL SETDLT ;SET INCREMENT
106: NXT01:
107: CALL DOTUP
108: LOOP NXT01
109: CALL XORDOT ;SET NEW DOT
110: CALL XYDISP ;DISP NEW XXX,YYY
首先,104 和105 会重复多次,109 及110 亦然,为什么不合并为一呢?这也是很常见的程式合并手法,两次调用合为一次,速度及空间都较为经济。
上一页 [1] [2] [3] [4] [5] 下一页 |