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

📄 engine.asm

📁 一个DOS下的文本编辑器
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;--------------SET CURSOR POSITION----------------------
SET_CUR MACRO   OP1,OP2
        PUSH    AX
        PUSH    BX
        PUSH    DX
        MOV     AH,02H
        MOV     BH,00H
        MOV     DH,OP1
        MOV     DL,OP2
        INT     10H
        POP     DX
        POP     BX
        POP     AX
ENDM
;-------------------------------------------------------

;---------------MOV CURSOR RIGHT AND LEFT---------------
RIGHT_MOV_CUR   MACRO
        MOV     AH,03H
        MOV     BH,00H
        INT     10H
        MOV     AH,02H
        INC     DL
        INT     10H
ENDM

LEFT_MOV_CUR    MACRO
        MOV     AH,03H
        MOV     BH,00H
        INT     10H
        MOV     AH,02H
        DEC     DL
        INT     10H
ENDM

;-------------------------------------------------------

;---------------GET CURSOR POSITION---------------------
GET_CUR_POS     MACRO
        PUSH    AX
        PUSH    BX
        PUSH    CX
        MOV     AH,03H
        MOV     BH,00H
        INT     10H
        POP     CX
        POP     BX
        POP     AX
ENDM
;-------------------------------------------------------
EXTRN   INIT_WS:FAR
EXTRN   P0_TO_P1:FAR
EXTRN   P1_TO_P0:FAR
EXTRN   SAVE_P1:FAR
EXTRN   RESET_P1:FAR

EXTRN   BACK_SPACE:FAR
EXTRN   INSERT:FAR
EXTRN   NEXT_BEGIN_POS:FAR
EXTRN   UP_POS:FAR
EXTRN   DOWN_POS:FAR
EXTRN   TELL_END:FAR

DATA    SEGMENT PARA
        ;'SAVE_FILE' SAVES TEXT IN IT
FILENAME        DB      'TEXT.TXT',0
HANDLE          DW      ?
        ;KEY CODES
UP      DW      4800H
DOWN    DW      5000H
LEFT    DW      4B00H
RIGHT   DW      4D00H
ENTE    DW      1C0DH   ;ENTER IS RESERVED WORD
BACKSP  DW      0E08H
        ;CRITICAL DATA
TEXT            DB      4000H   DUP(?)  ;16KB CHAR AT MOST
TEXT_LEN        DW      0
BEGIN_POS       DW      0
BEGIN_LINE      DW      0
END_POS         DW      0
END_LINE        DW      0
CURRENT_POS     DW      0
CURRENT_LINE    DW      0
CURSOR_POS      DW      0
        ;SAVE THE END POSITION OF EACH LINE
LEND_POS_ARR    DB      24      DUP(?)
BEGIN_POS_ARR   DB      1000H   DUP(?)  ;4K LINE AT MOST
END_POS_ARR     DB      1000H   DUP(?)
DATA    ENDS

CODE	SEGMENT	PARA	'CODE'
        ASSUME  CS:CODE,DS:DATA
	PUBLIC	GET_INPUT
        PUBLIC  NEW_FILE
        PUBLIC  SAVE_FILE
        PUBLIC  EDIT_WORKSPACE
        
;----------------------------GET INPUT-------------------------------
GET_INPUT       PROC    FAR
        ;RETURN AX -WHAT IS THE INPUT
        MOV     AH,00H
        INT     16H

RETURN: RETF
GET_INPUT       ENDP
;--------------------------------------------------------------------


;---------------------------EDIT WORKSPACE---------------------------
EDIT_WORKSPACE  PROC    FAR
        ;ENTRY: THE KEYCODE IN STACK
        ;MORE PROFESSIONAL THAN USE AX DERICTLY ^_^
        PUSH    BP
        MOV     BP,SP
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX
        PUSH    DS

        MOV     AX,DATA
        MOV     DS,AX
        MOV     AX,[BP+6]       ;RECKON THAT FAR PUSH CS:IP

        GET_CUR_POS
        MOV     CURSOR_POS,DX

        CMP     AX,ENTE
        JNZ     E_CONT1
        CALL    PRESS_ENTER
        JMP     EDIT_RETURN
E_CONT1:
        CMP     AX,UP
        JNZ     E_CONT2
        CALL    PRESS_UP
        JMP     EDIT_RETURN
E_CONT2:
        CMP     AX,DOWN
        JNZ     E_CONT3
        CALL    PRESS_DOWN
        JMP     EDIT_RETURN
E_CONT3:
        CMP     AX,LEFT
        JNZ     E_CONT4
        CALL    PRESS_LEFT
        JMP     EDIT_RETURN
E_CONT4:
        CMP     AX,RIGHT
        JNZ     E_CONT5
        CALL    PRESS_RIGHT
        JMP     EDIT_RETURN
E_CONT5:
        CMP     AX,BACKSP
        JNZ     E_CONT6
        CALL    PRESS_BACKSP
        JMP     EDIT_RETURN
E_CONT6:        ;ASSUME A CHAR INPUT
        
        CALL    CHAR_INPUT
EDIT_RETURN:
        CALL    RESET_P1
        ;DOUBLE BUFFER
        ;2 PAGES TO AVOID FLASH


        CALL    SHOW_TEXT       ;SHOW IN PAGE1
        
        CALL    P1_TO_P0        ;COPY TO PAGE0

        MOV     AX,CURRENT_POS
        PUSH    AX
        CALL    DEBUG

        CALL    SET_CURSOR
        POP     DS
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        POP     BP
        RETF    2
EDIT_WORKSPACE  ENDP
;--------------------------------------------------------------------

;--------------------------PRESS_UP----------------------------------
PRESS_UP        PROC    NEAR
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX

        MOV     DX,CURSOR_POS
        DEC     DH
        CMP     DH,0
        JA      PU_CONT3
        INC     DH

COMMENT % ----*THIS FUNCTION HAS NOT BEEN FINISHED*----------       
        ;[TODO]: DEC BEGIN_LINE IF THIS IS NOT THE FIRST LINE
        ;CACULATE BEGIN_POS
        ;DEC END_LINE AND CACULATE END_POS IF END_LINE IS 24
        ;BIGGER THAN BEGIN_LINE
        ;CACULATE CURRENT_POS
        INC     DH
        MOV     AX,CURRENT_LINE
        CMP     AX,0
        JA      PU_CONT1
        JMP     PU_RETURN
PU_CONT1:
        DEC     CURRENT_LINE
        DEC     BEGIN_LINE
        MOV     BX,CURRENT_LINE
        XOR     AH,AH
        MOV     AL,BEGIN_POS_ARR[BX]
        MOV     BX,BEGIN_POS
        MOV     BEGIN_POS,AX

        MOV     CL,DL
        XOR     CH,CH
        DEC     CX
        SUB     CURRENT_POS,CX
        MOV     DL,1
        SUB     BX,AX
        SUB     CURRENT_POS,BX

        MOV     BX,BEGIN_LINE
        MOV     AX,END_LINE
        ADD     BX,24   ;[24 ?]
        CMP     BX,AX
        JA      PU_RETURN
        DEC     END_LINE
        XOR     AH,AH
        MOV     AL,LEND_POS_ARR[23]     ;[24 ?]
        SUB     END_POS,AX
        ---------------------------------------------------- %
        JMP     PU_RETURN

PU_CONT3:
        ;ALSO MOVE CURSOR LEFT WHEN THE UPPER LINE IS SHORT
        DEC     CURRENT_LINE
        XOR     BH,BH
        MOV     BL,DH
        MOV     CL,LEND_POS_ARR[BX]
        CMP     CL,DL
        JA      PU_CONT4
        MOV     DL,CL
        ;JUST MOVE THE CURSOR UP AND CACULATE CURRENT_POS
PU_CONT4:
        MOV     AX,CURRENT_POS
        LEA     BX,TEXT
        XOR     CH,CH
        PUSH    AX
        PUSH    BX
        PUSH    CX
        CALL    UP_POS
        MOV     CURRENT_POS,AX
PU_RETURN:
        MOV     CURSOR_POS,DX
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        RET
PRESS_UP        ENDP
;--------------------------------------------------------------------

;--------------------------PRESS_DOWN----------------------------------
PRESS_DOWN      PROC    NEAR
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX

        MOV     AX,TEXT_LEN
        LEA     BX,TEXT
        MOV     CX,CURRENT_POS
        MOV     DX,CURSOR_POS
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX
        CALL    TELL_END
        CMP     AX,1
        JZ      PD_RETURN
        INC     DH
        INC     CURRENT_LINE
        CMP     DH,24
        JBE     PD_CONT1

        
        ;[TODO]: INC END_LINE IF THIS IS NOT THE LAST LINE
        ;CACULATE END_POS
        ;DEC BEGIN_LINE AND CACULATE BEGIN_POS
        ;CACULATE CURRENT_POS
        INC     DH
        JMP     PD_RETURN
PD_CONT1:
        XOR     BH,BH
        MOV     BL,DH
        MOV     CL,LEND_POS_ARR[BX]
        CMP     CL,DL
        JA      PD_CONT2
        ;ALSO MOVE CURSOR LEFT WHEN THE NEXT LINE IS SHORT
        MOV     DL,CL
        ;JUST MOVE THE CURSOR DOWN AND CACULATE CURRENT_POS
PD_CONT2:
        MOV     CL,DL
        MOV     AX,CURRENT_POS
        LEA     BX,TEXT
        XOR     CH,CH
        PUSH    AX
        PUSH    BX
        PUSH    CX
        CALL    DOWN_POS
        MOV     CURRENT_POS,AX
PD_RETURN:
        MOV     CURSOR_POS,DX
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        RET
PRESS_DOWN      ENDP
;--------------------------------------------------------------------

;--------------------------PRESS LEFT--------------------------------
PRESS_LEFT      PROC    NEAR
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX

        MOV     AX,CURRENT_POS
        CMP     AX,0
        JZ      PL_RETURN

        MOV     DX,CURSOR_POS
        CMP     DL,1
        JBE     PL_CONT1
        DEC     DL
        DEC     CURRENT_POS
        JMP     PL_RETURN
PL_CONT1:
                ;MOVE TO THE PREVIOUS LINE (IT EXSIT OF COURSE)
        DEC     DH
        DEC     CURRENT_LINE
        XOR     BH,BH
        MOV     BL,DH
        MOV     DL,LEND_POS_ARR[BX]
        MOV     BX,CURRENT_POS
        MOV     AL,0AH
        DEC     BX
        CMP     AL,TEXT[BX]
        JZ      PL_CONT2        ;WHY?
        JMP     PL_RETURN
PL_CONT2:
        DEC     CURRENT_POS
        DEC     CURRENT_POS
PL_RETURN:
        MOV     CURSOR_POS,DX
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        RET
PRESS_LEFT      ENDP
;--------------------------------------------------------------------

;--------------------------PRESS RIGHT-------------------------------
PRESS_RIGHT     PROC    NEAR
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX

        MOV     AX,CURRENT_POS
        CMP     AX,TEXT_LEN
        JAE     PR_RETURN

        MOV     DX,CURSOR_POS
        XOR     BH,BH
        MOV     BL,DH
        CMP     DL,LEND_POS_ARR[BX]
        JAE     PR_CONT1
        INC     DL
        INC     CURRENT_POS
        JMP     PR_RETURN
PR_CONT1:
                ;MOVE TO NEXT LINE IF EXSIT
        INC     DH
        INC     CURRENT_LINE
        MOV     DL,1
        MOV     BX,CURRENT_POS
        MOV     AL,0DH
        CMP     AL,TEXT[BX]
        JZ      PR_CONT2
        JMP     PR_RETURN
PR_CONT2:
        INC     CURRENT_POS
        INC     CURRENT_POS
PR_RETURN:
        MOV     CURSOR_POS,DX
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        RET
PRESS_RIGHT     ENDP
;--------------------------------------------------------------------

;--------------------------PRESS ENTER-------------------------------
PRESS_ENTER     PROC    NEAR
        PUSH    AX

⌨️ 快捷键说明

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