📄 test.asm
字号:
;╔━┅━┅━┅━┅━┅━┅━┅━┅━━┅━┅━┅━┅━┅━┅━ ╗
;┃≡DosEditer V0.1 -----powered by BlasterKai! ≡ ┃
;┃ - ¤╭⌒╮ ╭⌒╮ ┃
;┃ ╱◥██◣ ╭ ⌒ ┃
;┃ |田︱田田| ╰---------一切都精彩-------缘自Buaa!! ┃
;┃︵﹏~︵﹏~︵﹏~︵﹏~︵﹏~︵ ┃
;╚┅━┅━┅━┅━┅━┅━┅━┅━┅━┅━┅━┅━┅━┅━┅━ ╝
;
;━┅━┅━┅━┅━┅━┅━┅━┅━━┅━┅━┅━┅━┅━┅━┅━
;DosEditer V0.2 ---2004.11.16
; update: 1。修正键盘控制 2。对界面进行重新规划
;----------------------------------------------------------------
;DosEditer V0.3 ---2004.11.28
; update: 1。加入日期信息显示 2。实现文件读写模块
;----------------------------------------------------------------
;━┅━┅━┅━┅━┅━┅━┅━┅━━┅━┅━┅━┅━┅━┅━┅━
.model small
stack segment stack
WORD 100 DUP(?)
STACK ENDS
DATA SEGMENT PARA
UP_INDENT EQU 2
DOWN_INDENT EQU 26
ROW byte 2
COL byte 0
head_menu byte ' File Edit Help','$'
foot_info byte ' F1 Active help',6 DUP(' '),'F2 Active file',12 DUP(' '),'ESC to exit','$'
msg_date byte 'Date: ','$'
msg_row byte 'Row: ','$'
msg_col byte 'Col: ','$'
filename byte 'd:\dict.txt',0
save_filename byte 'd:\dictx.txt',0
handle word 0
count_buffer byte 5 DUP(0),'$'
DATA_BUFFER BYTE 124 DUP(0),'$'
buffer_len EQU $-data_buffer
;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 show_date
call open_file
call READ_FILE
call close_file
CALL SET_CURSOR
CALL DISP_DATA
NEXT:
CALL SET_CURSOR
CALL DEAL_KEYBRD
CMP AH,01H
JNE NEXT
CALL CLEAR_SCREEN
call save_file
call CLOSE_FILE
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,0100H
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,buffer_len
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,buffer_len
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
;-----------------------
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 ascii
;call deal_F3
jmp dealok
;---------------------
ascii:
CALL ASCII_CHAR
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 buffer_len
MOV CX,buffer_len
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
;*******************************************************
ASCII_CHAR proc near
cmp al,20h ;显示ASCII码大于20小于7EH的字符
jb asciiok
cmp al,7eh
ja asciiok
;mov dl,al
;mov ah,02h
;int 21h
xor bh,bh ;在光标位置显示字符
mov bl,6h
mov al,al
mov ah,0eh
int 10h
asciiok:
ret
ASCII_CHAR endp
;******************************************************
show_date proc near
push word ptr row
mov row,0
mov col,64
call SET_CURSOR
mov ah,2ah ;取得系统日期
int 21h ;AL星期,DL日,DH月,CX年
push cx
push dx ;保存取得的日期
push dx
mov dx,offset msg_date
mov ah,09h
int 21h
add col,6
call SET_CURSOR
;xor ah,ah ;暂不显示星期几
;call deal_num
;add col,3
;call SET_CURSOR
pop dx
xor ah,ah
mov al,dh ;输出月
call deal_num
add col,2
call SET_CURSOR
mov dl,'/'
mov ah,02h
int 21h
pop dx
xor ah,ah
mov al,dl ;输出日
call deal_num
add col,4
call SET_CURSOR
pop cx
mov ax,cx ;输出年
call deal_num
pop word ptr row
ret
show_date 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
push word ptr row ;设置光标于行列值处
mov row,27
mov col,64
call SET_CURSOR
mov dx,offset msg_row
mov ah,09h
int 21h
add col,5
call SET_CURSOR
pop word ptr row
mov al,row
xor ah,ah
dec ax ;有丙行为菜单栏,不计入
call deal_num
;设置光标于行列值处
mov row,27
mov col,72
call SET_CURSOR
mov dx,offset msg_col
mov ah,09h
int 21h
add col,5
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
;*********************************************************
open_file proc near
lea dx,filename ;打开所读文件
mov al,2
mov ah,3dh
INT 21h
;jc open_error
mov handle,ax ;保存文件句柄
open_file endp
;******************************关闭文件****************
READ_FILE proc near
mov bx,handle
mov cx,buffer_len ;N个字节
lea dx,data_buffer
mov ah,3fh
INT 21h
;jc read_error
ret
READ_FILE endp
;******************************************************
save_file proc near
push word ptr row
;---------------------
lea dx,save_filename ;打开所读文件
mov al,2
mov ah,3dh
INT 21h
;jc open_error
mov handle,ax ;保存文件句柄
mov row,UP_INDENT
mov col,DOWN_INDENT
lea di,data_buffer
mov cx,buffer_len
xor bh,bh
next_char:
mov ah,08h
int 10h
mov [di],ah
inc di
call DEAL_KEY_RIGHT
loop next_char
;----------------------
lea di,data_buffer
mov bx,handle
mov cx,buffer_len
mov ah,40h
int 21h
;----------------------
pop word ptr row
ret
SAVE_FILE endp
;*******************************************************
CLOSE_FILE PROC NEAR
MOV AH,3EH
MOV BX,HANDLE
INT 21H
RET
CLOSE_FILE 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 + -