⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 core.asm

📁 一个DOS下的文本编辑器
💻 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 + -