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