📄 core.asm
字号:
CODE SEGMENT PARA 'CODE'
ASSUME CS:CODE
PUBLIC BACK_SPACE
PUBLIC INSERT
PUBLIC NEXT_BEGIN_POS
PUBLIC UP_POS
PUBLIC DOWN_POS
PUBLIC TELL_END
;----------------------------MEMMOVE--------------------------------
BACK_SPACE PROC FAR
;ENTRY- CURRENT_POS,TEXT,TEXT_LEN
PUSH BP
MOV BP,SP
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,[BP+6] ;TEXT_LEN
MOV BX,[BP+8] ;TEXT
MOV AX,[BP+10] ;CURRENT_POS
CMP AX,0
JZ BS_RETURN
CMP CX,0
JZ BS_RETURN
CMP CX,AX
JBE BS_RETURN
;NOW DO MEMMOVE
MOV DX,DS
MOV ES,DX
MOV SI,BX
MOV DI,BX
ADD SI,AX
ADD DI,AX
DEC DI
SUB CX,AX
CLD
REP MOVSB
BS_RETURN:
POP DX
POP CX
POP BX
POP AX
POP BP
RETF 6
BACK_SPACE ENDP
;--------------------------------------------------------------------
;-----------------------ALSO MEMMOVE---------------------------------
INSERT PROC FAR
;ENTRY- CURRENT_POS,TEXT,TEXT_LEN
PUSH BP
MOV BP,SP
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,[BP+6] ;TEXT_LEN
MOV BX,[BP+8] ;TEXT
MOV AX,[BP+10] ;CURRENT_POS
CMP CX,AX
JBE IS_RETURN
;NOW DO MEMMOVE
MOV DX,DS
MOV ES,DX
MOV SI,BX
MOV DI,BX
ADD SI,CX
ADD DI,CX
INC DI
SUB CX,AX
INC CX
STD
REP MOVSB
IS_RETURN:
POP DX
POP CX
POP BX
POP AX
POP BP
RETF 6
INSERT ENDP
;--------------------------------------------------------------------
;------------------------NEXT_BEGIN_POS------------------------------
NEXT_BEGIN_POS PROC FAR
;ENTRY- BEGIN_POS,TEXT
;RETURN- AX:NEXT BEGIN POS
PUSH BP
MOV BP,SP
PUSH BX
PUSH CX
PUSH DX
MOV BX,[BP+6] ;TEXT
MOV AX,[BP+8] ;BEGIN_POS
PUSH AX
MOV DX,DS
MOV ES,DX
MOV CX,78
MOV DI,BX
ADD DI,AX
MOV AL,0AH
CLD
REPNE SCASB
CMP CX,0
JNZ NBP_CONT1
POP AX
ADD AX,78
JMP NBP_RETURN
NBP_CONT1:
MOV BX,78
SUB BX,CX
POP AX
ADD AX,BX
NBP_RETURN:
POP DX
POP CX
POP BX
POP BP
RETF 4
NEXT_BEGIN_POS ENDP
;--------------------------------------------------------------------
;---------------------CACULATE MOVE UP POS---------------------------
UP_POS PROC FAR
;ENTRY- CURRENT_POS,TEXT,LAST LINE'S END POSITION
;RETURN- AX:THE UP CURRENT POS
PUSH BP
MOV BP,SP
PUSH BX
PUSH CX
PUSH DX
MOV CX,[BP+6] ;LAST LINE'S END POSITION
MOV BX,[BP+8] ;TEXT
MOV AX,[BP+10] ;CURRENT_POS
PUSH CX
PUSH AX
MOV DX,DS
MOV ES,DX
MOV CX,78
MOV DI,BX
ADD DI,AX
MOV AL,0AH
STD
REPNE SCASB
CMP CX,0
JNZ UP_CONT1
;CANNOT FIND '0A'
POP AX
SUB AX,78 ;!!DON'T KNOW RIGHT OR NOT
POP CX
JMP UP_RETURN
UP_CONT1: ;'0A' FOUND
MOV AX,78
SUB AX,CX ;CURRENT_CURSOR'S DL
POP DX ;CURRENT_POS
POP CX ;LAST LINE'S END POSITION
CMP AX,CX
JA UP_CONT2
;NORMAL
MOV AX,DX
SUB AX,CX
DEC AX ;0D0A
JMP UP_RETURN
UP_CONT2:
;CURSOR SHOULD ALSO MOVE LEFT
SUB DX,AX
MOV AX,DX
UP_RETURN:
POP DX
POP CX
POP BX
POP BP
RETF 6
UP_POS ENDP
;--------------------------------------------------------------------
;---------------------CACULATE MOVE DOWN POS---------------------------
DOWN_POS PROC FAR
;ENTRY- CURRENT_POS,TEXT,CURSOR'S POSITION AFTER PRESSED DOWN
;RETURN- AX:THE DOWN CURRENT POS
PUSH BP
MOV BP,SP
PUSH BX
PUSH CX
PUSH DX
MOV CX,[BP+6] ;CURSOR'S POSITION AFTER PRESSED DOWN
MOV BX,[BP+8] ;TEXT
MOV AX,[BP+10] ;CURRENT_POS
PUSH CX
PUSH AX
MOV DX,DS
MOV ES,DX
MOV CX,78
MOV DI,BX
ADD DI,AX
MOV AL,0DH
CLD
REPNE SCASB
CMP CX,0
JNZ DP_CONT1
;CANNOT FIND '0D'
POP AX
ADD AX,78 ;!!DON'T KNOW RIGHT OR NOT
POP CX
JMP DP_RETURN
DP_CONT1: ;'0D' FOUND
MOV AX,78
SUB AX,CX ;CURRENT LINE'S RIGHT LEFT POSITION
POP DX ;CURRENT_POS
POP CX ;CURSOR'S POSITION AFTER PRESSED DOWN
ADD AX,CX
ADD AX,DX
DP_RETURN:
POP DX
POP CX
POP BX
POP BP
RETF 6
DOWN_POS ENDP
;--------------------------------------------------------------------
;------------TELL IF CURRENT POSITION IS AT THE END LINE-------------
TELL_END PROC FAR
;ENTRY- TEXT_LEN,TEXT,CURRENT_POS,CURSOR_POS
;RETRUN- AX:1 IS END, 0 IS NOT END
PUSH BP
MOV BP,SP
PUSH BX
PUSH CX
PUSH DX
MOV DX,[BP+6] ;CURSOR_POS
MOV CX,[BP+8] ;CURRENT_POS
MOV BX,[BP+10] ;TEXT
MOV AX,[BP+12] ;TEXT_LEN
XOR DH,DH
SUB CX,DX
SUB AX,CX
CMP AX,78
JBE TE_CONT1
MOV AX,0
JMP TE_RETURN
TE_CONT1:
MOV DX,DS
MOV ES,DX ;MAKE ES:[DI] RIGHT
MOV DI,BX
ADD DI,CX ;CX IS THE LAST LINE'S FIRST CHAR'S POSITION
MOV CX,AX ;AX IS THE NUMBER OF CHARS BETWEEN THE LAST
;LINE'S FIRST CHAR AND THE END
;AX IS NO BIGGER THAN 78
MOV AL,0DH
CLD
REPNE SCASB
CMP CX,0
JZ TE_CONT2
XOR AX,AX
JMP TE_RETURN
TE_CONT2:
MOV AX,1
TE_RETURN:
POP DX
POP CX
POP BX
POP BP
RETF 8
TELL_END ENDP
;--------------------------------------------------------------------
CODE ENDS
END BACK_SPACE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -