📄 97_editerindos_v0.2.asm
字号:
.model small
stack segment stack
WORD 100 DUP(?)
STACK ENDS
DATA SEGMENT PARA
UP_INDENT EQU 2
DOWN_INDENT EQU 27
DATALEN WORD 205
ROW byte 2
COL byte 0
head_menu byte ' File Edit Help','$'
foot_info byte ' F1 Active help F2 Active file','$'
count_buffer byte 5 DUP(0),'$'
DATA_BUFFER BYTE 'You have a multitude of source files spread out all over the place. You have to deal with functions that somebody else wrote. You have to figure out how some piece of code works and see all of its clients!','$' ;,1024 DUP(?),'$'
;DATA_TEMP BYTE 0DH,0AH,' You didn’t write the code, or you wrote it in a past life.','$'
data ENDS
CODE SEGMENT PARA
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
MOV AX,DATA ;初始化DS,ES
MOV DS,AX
MOV ES,AX
MOV AX,0600H
MOV BH,30H
MOV CX,0000H
MOV DX,1B4fH ;30*80
INT 10H
CALL CLEAR_SCREEN
call disp_head_foot
CALL SET_CURSOR
CALL DISP_DATA
NEXT:
CALL SET_CURSOR
CALL DEAL_KEYBRD
CMP AH,01H
JNE NEXT
CALL CLEAR_SCREEN
CALL RETURN
MAIN ENDP
;********************************************************
disp_head_foot proc near
mov bx,word ptr row
mov row,0
mov col,0
call SET_CURSOR
mov dx,offset head_menu
mov ah,09h
int 21h
mov row,27
mov col,0
call SET_CURSOR
mov dx,offset foot_info
mov ah,09h
int 21h
mov word ptr row,bx
ret
disp_head_foot endp
;********************************************************
CLEAR_SCREEN PROC NEAR
MOV AX,0600H
MOV BH,10H
MOV CX,0200H
MOV DX,1A4fH ;30*80
INT 10H
RET
CLEAR_SCREEN ENDP
;********************************************************
SET_CURSOR PROC NEAR
MOV AH,2H
XOR BH,BH
MOV DH,ROW
MOV DL,COL
INT 10H
RET
SET_CURSOR ENDP
;*******************************************************
DISP_DATA PROC NEAR
MOV AX,1301H ;
MOV BX,0016H
LEA BP,DATA_BUFFER
MOV CX,DATALEN
MOV DH,ROW
MOV DL,COL
INT 10H
RET
DISP_DATA ENDP
;*******************************************************
DISP_CHAR PROC NEAR
LEA BP,DATA_BUFFER
ADD BP,BX
MOV CX,DATALEN
SUB CX,BX
MOV AX,1301H ;
MOV BX,0016H
MOV DH,ROW
MOV DL,COL
INT 10H
RET
DISP_CHAR ENDP
;********************************************************
DEAL_KEYBRD PROC FAR
MOV AH,0H ;从键盘读取一个字符
INT 16H ;AH扫描,AL字符码
push ax
;CMP AL,00H
;JE LEFT
;CMP AL,0E0H
;JE LEFT
;CALL ASCIICHAR
;JMP DEALOK
;-----------------------
LEFT:
CMP AH,4BH ;左箭头
JNE RIGHT
CALL DEAL_KEY_LEFT
JMP DEALOK
RIGHT:
CMP AH,4DH ;右箭头
JNE UP
CALL DEAL_KEY_RIGHT
JMP DEALOK
UP:
CMP AH,48H ;上箭头
JNE DOWN
CALL DEAL_KEY_UP
JMP DEALOK
DOWN:
CMP AH,50H ;下箭头
JNE home
CALL DEAL_KEY_DOWN
JMP DEALOK
HOME:
CMP AH,47H ;HOME
JNE ENDkey
CALL DEAL_KEY_HOME
JMP DEALOK
ENDkey:
CMP AH,4FH ;END
JNE enterkey
CALL DEAL_KEY_END
JMP DEALOK
ENTERkey:
cmp ah,1ch ;回车
jne delete
call deal_key_enter
jmp dealok
DELETE:
CMP AH,53H ;删除
JNE BACK
CALL DEAL_KEY_DELETE
JMP DEALOK
BACK:
CMP AH,0EH ;退格
JNE f1
CALL DEAL_KEY_BACK
JMP DEALOK
;--------------------
F1:
cmp ah,3bh
jne F2
;call deal_F1
jmp dealok
F2:
cmp ah,3bh
jne F3
;call deal_F2
jmp dealok
F3:
cmp ah,3bh
jne dealok
;call deal_F3
jmp dealok
;---------------------
DEALOK:
call show_cursor_num
pop ax
RET
DEAL_KEYBRD ENDP
;********************************************************
DEAL_KEY_LEFT PROC NEAR ;左箭头处理
CMP COL,0
JBE OUTcol
DEC COL
JMP DEALOK
OUTcol:
cmp row,2
jbe outrow
CALL DEAL_KEY_UP ;只到上一行最右
jmp movend
outrow: ;到达屏幕左上角,则移到右下角
mov row,26
movend:
CALL DEAL_KEY_END
DEALOK:
RET
DEAL_KEY_LEFT ENDP
;********************************************************
DEAL_KEY_RIGHT PROC NEAR ;右箭头处理
CMP COL,79
JAE OUTcol
INC COL
JMP DEALOK
OUTcol:
cmp row,26
jae outrow
CALL DEAL_KEY_DOWN ;只到上一行最左
jmp movend
outrow:
mov row,2 ;到达屏幕右下角,则移到左上角
movend:
CALL DEAL_KEY_HOME
DEALOK:
RET
DEAL_KEY_RIGHT ENDP
;********************************************************
DEAL_KEY_UP PROC NEAR ;上箭头处理
CMP ROW,UP_INDENT
JBE OUTLINE
DEC ROW
JMP DEALOK
OUTLINE:
DEALOK:
RET
DEAL_KEY_UP ENDP
;********************************************************
DEAL_KEY_DOWN PROC NEAR ;下箭头处理
CMP ROW,DOWN_INDENT
JAE OUTLINE
INC ROW
JMP DEALOK
OUTLINE:
DEALOK:
RET
DEAL_KEY_DOWN ENDP
;********************************************************
DEAL_KEY_HOME PROC NEAR ;HOME处理
MOV COL,0
CALL SET_CURSOR
RET
DEAL_KEY_HOME ENDP
;*******************************************************
DEAL_KEY_END PROC NEAR ;END处理
MOV COL,79
CALL SET_CURSOR
RET
DEAL_KEY_END ENDP
;*******************************************************
deal_key_enter PROC NEAR ;回车键处理
cmp row,26
jae dealok
inc row
call DEAL_KEY_HOME
dealok:
RET
deal_key_enter ENDP
;*******************************************************
DEAL_KEY_DELETE PROC NEAR ;删除键处理
MOV BL,COL
XOR BH,BH
PUSH BX
MOV BL,ROW
PUSH BX
;--------------
MOV AL,ROW
SUB AL,2H
MOV BL,4FH
MUL BL
MOV BL,COL
ADD BX,AX
DEC DATALEN
MOV CX,DATALEN
SUB CX,BX
LEA DI,[DATA_BUFFER+BX]
LEA SI,[DATA_BUFFER+BX+1]
NEXT:
LODSB
STOSB
LOOP NEXT
MOV ROW,2
MOV COL,0
CALL DISP_DATA
;INC COL
;CALL SET_CURSOR
;---------------------
POP BX
MOV ROW,BL
POP BX
MOV COL,BL
CALL SET_CURSOR
RET
DEAL_KEY_DELETE ENDP
;*******************************************************
DEAL_KEY_BACK PROC NEAR ;后退键处理
cmp col,0
je outrow
dec col
jmp dealok
outrow:
dec row
call DEAL_KEY_END
dealok:
call DEAL_KEY_DELETE
RET
DEAL_KEY_BACK ENDP
;*******************************************************
show_cursor_num proc near
push word ptr row
;--------------------
MOV AX,0600H ;清除原有计数显示
MOV BH,30H
MOV CX,1b3cH
MOV DX,1B4fH ;30*80
INT 10H
;---------------------
push word ptr row ;设置光标于行列值处
mov row,27
mov col,60
call SET_CURSOR
pop word ptr row
mov al,row
xor ah,ah
dec ax ;有丙行为菜单栏,不计入
call deal_num
push word ptr row ;设置光标于行列值处
mov row,27
mov col,70
call SET_CURSOR
pop word ptr row
mov al,col
xor ah,ah
inc ax ;系统是从0开始计数的,所以要加1
call deal_num
;-----------------------
pop word ptr row
ret
show_cursor_num endp
;********************************************************
DEAL_NUM PROC NEAR ;将一个字转换成十进制并输出子程序
push di
MOV CX,5
MOV BX,10
MOV DI,OFFSET count_buffer+4 ;从后往前保存
LP4: XOR DX,DX ;将DX清零
DIV BX
OR DL,30H ;也可用ADD DL,30H
MOV BYTE PTR [DI],DL ;将16进制的数转换到ASCII中对应的数,0的ASCII码为 30H (48D)
CMP AX,0
JZ PRINT ;当商为0时,直接去打印,可不打印高位的0.
DEC DI
LOOP LP4
PRINT:
MOV DX,DI ;从DI开始打印,因为RESULT不一定够5位
MOV AH,9
INT 21H ;调用DOS的21号中断的9号功能,将DB输出
pop di
RET
DEAL_NUM ENDP
;*********************************************************
;********************************************************
RETURN PROC NEAR
MOV AX,4C00H
INT 21H
RET
RETURN ENDP
;*******************************************************
CODE ENDS
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -