实验16,我的改版,由于各种原因……编了个娱乐版!
本帖最后由 zealstar 于 2016-12-12 08:07 编辑原版的实验16是要求替换7ch中断,但是,他妹的dosbox总是不行。我怀疑就是dosbox本身的问题,很可能安全内存区有其他内容,所以造成了无法实现调用7ch中断例程的结果。
索性,改版来玩。改成,运行程序后,可以通过A,S,D,F,G来操作屏幕。A是清屏,S是改前景,D改背景,F是滚动一行,G是退出。
执行结果如下:
代码分享:
**** Hidden Message *****
但是目前感觉还不太完善,按键一下就变N个颜色……嗯,考虑如何改良中……{:10_277:} 哇哈哈哈,改良成功!原理是这样啊,大家自行体会吧。
代码:
**** Hidden Message ***** 过来学习学习 have a look 本帖最后由 auyhin丶 于 2017-1-11 18:57 编辑
我回头写了下这个.要跟你作用一样的。 但是为什么我写到往上滚动那行代码的时候却实现不了。
一按F就成这样了。
它不会向上滚动...
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
ML DB 160 DUP(?),'Please enter a command',58 DUP (?),';后面有$
HH DB 'A=clear,S=char color,D=char background color,F=roll a line,G=exit',' ;后面有$,这个显示不出来..
;A=1E,S=1F,D=20H,F=21H,G=22H扫描码, A是清屏。S设置前景色。D设置背景色。F滚动一行。按G退出。
START:
MOV AX,CS
MOV DS,AX
MOV DI,0
LEA DX,ML
MOV AH,9
INT 21H
LEA DX,HH
MOV AH,9
INT 21H
MOV AX,0B800H
MOV ES,AX
MOV DL,0
A: IN AL,60H
CMP AL,1EH
JNE NEXT1
CALL CLEAR
NEXT1:
CMP AL,1FH
JNE NEXT2
CALL CHAR1
NEXT2:
CMP AL,20H
JNE NEXT3
CALL CHAR2
NEXT3:
CMP AL,21H
JNE NEXT4
CALL ROLL
NEXT4:
CMP AL,22H
JE P
JMP A
P:MOV AH,4CH
INT 21H
CLEAR:
PUSH CX
PUSH ES
PUSH DI
MOV CX,2000
S1: MOV BYTE PTR ES:,20H
MOV BYTE PTR ES:,0
INC DI
INC DI
LOOP S1
POP DI
POP ES
POP CX
RET
CHAR1:
PUSH CX
PUSH ES
PUSH DI
INC DL
AND DL,00000111B
MOV DI,1
MOV CX,2000
S2: MOV BYTE PTR ES:,DL
INC DI
INC DI
LOOP S2
POP DI
POP ES
POP CX
RET
CHAR2:
PUSH CX
PUSH ES
PUSH DI
ADD DL,00010000B
AND DL,01110000B
MOV DI,1
MOV CX,2000
S3: MOV BYTE PTR ES:,DL
INC DI
INC DI
LOOP S3
POP DI
POP ES
POP CX
RET
ROLL:
PUSH CX
PUSH ES
PUSH DI
MOV AX,0B800H
MOV DS,AX
MOV SI,160
MOV ES,AX
MOV DI,0
MOV CX,160*3
CLD
REP MOVSB
MOV CX,160
MOV DI,160
S4: MOV BYTE PTR ES:,20H
ADD DI,2
LOOP S4
POP DI
POP ES
POP CX
RET
CODES ENDS
END START
本帖最后由 zealstar 于 2017-1-11 19:03 编辑
auyhin丶 发表于 2017-1-11 18:44
我回头写了下这个.要跟你作用一样的。 但是为什么我写到往上滚动那行代码的时候却实现不了。
一按F就成这 ...
函数内:
119行:MOV CX,160*4
应该是:MOV CX, 160*24
你这样只拷贝了4行……{:10_250:}
另外:
你发现了么,如果只是对比通码而不对比断码,就会连续发送命令。所以会上卷n行,哪怕你是拷贝的4行,也会一下滚n行(键盘连发啊)自然只有黑屏了……所以我自己改良后就是先对比通码(键按下)再对比断码(键弹起)才call功能函数。{:10_256:}
再补一下:
这个论坛里引用代码里面,单引号加$是一个特殊格式,所以如果要显示$,改成双引号就行了。{:10_285:} {:10_285:} 果然还是要考虑断码.. 过来看一看。 学习学习
666 可能是在dosbox中中断系统会出问题?{:10_249:} 学习学习 学习一下 我也来学习一下
页:
[1]