📄 engine.asm
字号:
;--------------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 + -