zealstar 发表于 2016-12-12 08:05:03

实验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:}

zealstar 发表于 2016-12-12 08:17:29

哇哈哈哈,改良成功!原理是这样啊,大家自行体会吧。

代码:
**** Hidden Message *****

rootquan 发表于 2017-1-2 01:34:44

过来学习学习

auyhin丶 发表于 2017-1-11 15:07:37

have a look

auyhin丶 发表于 2017-1-11 18:44:37

本帖最后由 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:01:18

本帖最后由 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:}

auyhin丶 发表于 2017-1-11 19:20:36

{:10_285:} 果然还是要考虑断码..

kyowjw01 发表于 2017-6-14 09:12:27

过来看一看。

nihility_z 发表于 2019-9-8 01:17:47

学习学习

toby1a05 发表于 2019-9-22 14:27:43

666

发表于 2019-9-22 15:07:13

可能是在dosbox中中断系统会出问题?{:10_249:}

hahahahe 发表于 2020-6-17 08:28:23

学习学习

Thief_Ws 发表于 2020-6-30 12:48:01

学习一下

freedomOO 发表于 2021-6-13 15:38:01

我也来学习一下
页: [1]
查看完整版本: 实验16,我的改版,由于各种原因……编了个娱乐版!