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

📄 engine.asm

📁 一个DOS下的文本编辑器
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        PUSH    BX
        PUSH    CX
        PUSH    DX

        ;TODO:  MEMMOVE 2 TIMES
        MOV     AX,CURRENT_POS
        LEA     BX,TEXT
        MOV     CX,TEXT_LEN
        PUSH    AX
        PUSH    BX
        PUSH    CX
        CALL    INSERT
        MOV     BX,CURRENT_POS
        MOV     TEXT[BX],0DH
        INC     TEXT_LEN
        INC     END_POS
        INC     CURRENT_POS

        MOV     AX,CURRENT_POS
        LEA     BX,TEXT
        MOV     CX,TEXT_LEN
        PUSH    AX
        PUSH    BX
        PUSH    CX
        CALL    INSERT
        MOV     BX,CURRENT_POS
        MOV     TEXT[BX],0AH
        INC     TEXT_LEN
        INC     END_POS
        INC     CURRENT_POS

        INC     END_LINE
        MOV     DX,CURSOR_POS

        MOV     DL,1
        INC     DH
        INC     CURRENT_LINE

        CMP     DH,24
        JB      PE_CONT1
        DEC     DH
        ;TODO: CACULATE BEGIN_POS
        INC     BEGIN_LINE
        MOV     BX,BEGIN_LINE
        MOV     AX,BEGIN_POS
                ;SAVE IT
        MOV     BEGIN_POS_ARR[BX],AL
        LEA     BX,TEXT
        PUSH    AX
        PUSH    BX
        CALL    NEXT_BEGIN_POS
        MOV     BEGIN_POS,AX
PE_CONT1:
        MOV     CURSOR_POS,DX
        POP     DX
        POP     CX
        POP     BX
        POP     AX

        RET
PRESS_ENTER     ENDP
;--------------------------------------------------------------------

;--------------------------PRESS BACKSPACE---------------------------
PRESS_BACKSP    PROC    NEAR
        ;FIRST ASSUME CURSOR IS AT THE END
        ;NOW THIS ASSUME IS NOT NEEDED ANY MORE
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX

        MOV     AX,TEXT_LEN
        CMP     AX,0
        JBE     PBACK_RETURN
        MOV     AX,CURRENT_POS
        CMP     AX,0
        JBE     PBACK_RETURN

        ;TODO:  MEMMOVE ACCORDING TO CURRENT_POS
        MOV     AX,CURRENT_POS
        LEA     BX,TEXT
        MOV     CX,TEXT_LEN
        PUSH    AX
        PUSH    BX
        PUSH    CX
        CALL    BACK_SPACE      ;!!
        ;HELLO,WORLD -> HELLOWORLD
        DEC     CURRENT_POS
        DEC     TEXT_LEN
        DEC     END_POS

        MOV     DX,CURSOR_POS
        DEC     DL

        CMP     DL,0
        JA      PBACK_RETURN

        ;SPECIAL DEAL WITH ENTER OR AUTO NEXT LINE
        DEC     DH
        DEC     CURRENT_LINE
        DEC     END_LINE
        XOR     BH,BH
        MOV     BL,DH
        MOV     DL,LEND_POS_ARR[BX]     ;[QIUTE CONFUSED ABOUT IT]
        DEC     DL
        CMP     DL,78
        JZ      PBACK_RETURN

        INC     DL
        MOV     AX,TEXT_LEN
        CMP     AX,0
        JBE     PBACK_RETURN
        MOV     AX,CURRENT_POS
        CMP     AX,0
        JBE     PBACK_RETURN

        ;TODO:  MEMMOVE ACCORDING TO CURRENT_POS
        MOV     AX,CURRENT_POS
        LEA     BX,TEXT
        MOV     CX,TEXT_LEN
        PUSH    AX
        PUSH    BX
        PUSH    CX
        CALL    BACK_SPACE      ;!!
        ;HELLO,WORLD -> HELLOWORLD
        DEC     CURRENT_POS
        DEC     TEXT_LEN
        DEC     END_POS

PBACK_RETURN:
        MOV     CURSOR_POS,DX
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        RET
PRESS_BACKSP    ENDP
;--------------------------------------------------------------------

;--------------------------CHAR INPUT--------------------------------
CHAR_INPUT      PROC    NEAR
        ;ENTRY: -AX KEY CODE, MAYBE AL IS CHAR ASCII CODE
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX

        MOV     DX,AX

        ;TODO:  MEMMOVE
        MOV     AX,CURRENT_POS
        LEA     BX,TEXT
        MOV     CX,TEXT_LEN
        PUSH    AX
        PUSH    BX
        PUSH    CX
        CALL    INSERT  ;JUST MOVE TO MAKE THE SPACE FOR DL
        MOV     BX,CURRENT_POS
        MOV     TEXT[BX],DL
        INC     TEXT_LEN
        INC     END_POS
        INC     CURRENT_POS

        MOV     DX,CURSOR_POS
        INC     DL
        CMP     DL,78
        JBE     CI_RETURN
        MOV     DL,1
        INC     DH
        INC     CURRENT_LINE

        CMP     DH,24
        JB      CI_RETURN
        DEC     DH
        DEC     CURRENT_LINE
        ;TODO: CACULATE BEGIN_POS
        MOV     AX,BEGIN_POS
        LEA     BX,TEXT
        PUSH    AX
        PUSH    BX
        CALL    NEXT_BEGIN_POS
        MOV     BEGIN_POS,AX
        INC     BEGIN_LINE

CI_RETURN:
        MOV     CURSOR_POS,DX
        POP     DX
        POP     CX
        POP     BX
        POP     AX

        RET
CHAR_INPUT      ENDP
;--------------------------------------------------------------------

;------------------------SHOW TEXT IN WORKSPACE----------------------
SHOW_TEXT       PROC    NEAR
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX
        PUSH    DS

        MOV     AX,DATA
        MOV     DS,AX

        MOV     DX,0101H
        MOV     AH,02H
        MOV     BH,01H
        INT     10H
        MOV     CX,TEXT_LEN      
        CMP     CX,0
        JZ      ST_RET
        MOV     CX,END_POS
        SUB     CX,BEGIN_POS
        JBE     ST_RET
        MOV     SI,BEGIN_POS
        MOV     AH,0AH
        MOV     BH,01H  ;PAGE1
SHOW_LP:
        MOV     AL,TEXT[SI]
        PUSH    CX
        MOV     CX,01H  ;REPETITION
        INT     10H
        POP     CX
        INC     SI

        CMP     AL,0DH  ;SPECIAL DEAL WITH '0D0A'
        JNZ     ST_CONT1

        PUSH    BX
        XOR     BH,BH
        MOV     BL,DH
        MOV     LEND_POS_ARR[BX],DL
        POP     BX

        MOV     DL,1
        INC     DH
        INC     SI      ;'0D' IS NOT SHOWED
        DEC     CX
        JMP     ST_CONT2
ST_CONT1:
        INC     DL
        CMP     DL,78
        JBE     ST_CONT2

        PUSH    BX
        XOR     BH,BH
        MOV     BL,DH
        MOV     LEND_POS_ARR[BX],DL
        POP     BX

        MOV     DL,1
        INC     DH
ST_CONT2:
        ;SET_CUR DH,DL  ;THIS SET IS IN PAGE 0
        PUSH    AX
        MOV     AH,02H
        ;MOV     BH,01H
        INT     10H
        POP     AX
        LOOP    SHOW_LP

        XOR     BH,BH
        MOV     BL,DH
        MOV     LEND_POS_ARR[BX],DL

ST_RET:
        POP     DS
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        RET
SHOW_TEXT       ENDP
;--------------------------------------------------------------------

;---------------------------NEW FILE---------------------------------
NEW_FILE        PROC    FAR
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX
        PUSH    DS

        MOV     AX,DATA
        MOV     DS,AX
        ;CLEAR MEMOMRY
        XOR     AX,AX   ;HAHA~ PROFESSIONAL
        MOV     TEXT_LEN,AX
        MOV     BEGIN_POS,AX
        MOV     BEGIN_LINE,AX
        MOV     END_POS,AX
        MOV     END_LINE,AX
        MOV     CURRENT_POS,AX
        MOV     CURRENT_LINE,AX
        MOV     CURSOR_POS,AX

        MOV     CX,4000H
        XOR     BX,BX
NF_LP:
        MOV     TEXT[BX],AL
        INC     BX
        LOOP    NF_LP

        ; CLEAR WORKSPACE, RESET CURSOR
        CALL    INIT_WS
        CALL    P0_TO_P1
        CALL    SAVE_P1
        POP     DS
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        RETF
NEW_FILE        ENDP
;--------------------------------------------------------------------

;---------------------------SAVE FILE---------------------------------
SAVE_FILE       PROC    FAR
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX
        PUSH    DS

        MOV     AX,DATA
        MOV     DS,AX

        ;CREATE FILE 'TEXT.TXT', ASSUME NO ERROR
        MOV     AH,3CH
        MOV     CX,00H
        LEA     DX,FILENAME
        INT     21H
        JC      SF_RETURN
        MOV     HANDLE,AX

        MOV     AH,40H
        MOV     BX,HANDLE
        MOV     CX,TEXT_LEN
        LEA     DX,TEXT
        INT     21H

SF_RETURN:
        POP     DS
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        RETF
SAVE_FILE       ENDP
;--------------------------------------------------------------------


;----------------------------SET_CURSOR------------------------------
SET_CURSOR      PROC    NEAR
        PUSH    DX
        MOV     DX,CURSOR_POS
        SET_CUR DH,DL
        POP     DX
        RET
SET_CURSOR      ENDP
;--------------------------------------------------------------------

;----------------------------DEBUG-----------------------------------
DEBUG   PROC    NEAR
        ;ENTRY- VARIBLE
        PUSH    BP
        MOV     BP,SP
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX

        MOV     AX,[BP+4]
        SET_CUR 24,1
        XOR     AH,AH
        MOV     BL,100
        DIV     BL
        PUSH    AX
        OR      AL,30H
        MOV     AH,0EH
        MOV     BL,00H
        INT     10H
        POP     AX
        MOV     AL,AH
        XOR     AH,AH
        MOV     BL,10
        DIV     BL
        PUSH    AX
        OR      AL,30H
        MOV     AH,0EH
        MOV     BL,00H
        INT     10H
        POP     AX
        MOV     AL,AH
        OR      AL,30H
        MOV     AH,0EH
        MOV     BL,00H
        INT     10H

        POP     DX
        POP     CX
        POP     BX
        POP     AX
        POP     BP
        RET     2
DEBUG   ENDP
;--------------------------------------------------------------------
CODE    ENDS
        END     GET_INPUT

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -