forked from Lemonreds/assembly-solution
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patheditor.txt
432 lines (369 loc) · 4.54 KB
/
editor.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
;created on 2017 05 29
data segment
;menu
open db 'Open $'
save db ' Save $'
clear db 'Clear $'
;default file
file db 'MyEdit.txt',0
;file handle
fh dw ?
;buf
buf db 1600 dup(?)
buflength dw 0
;info
myedit db 'MyEdit','$'
OK db 'Success','$'
NO db 'Failed','$'
data ends
;stack
stack segment stack
dw 100h dup(?)
top label word
stack ends
;code
code segment
assume ds:data,cs:code,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
lea sp,top
;si->buf tail
lea si,buf
;init menu ,editarea
call menu
call editarea
;program menu
;init menu
menu proc near
;draw menu
mov al,0
mov bh,70h ;background
mov ch,0;left line
mov cl,0;left row
mov dh,0;right line
mov dl,80;right row
mov ah,06h
int 10h
;menu string
lea dx,open
mov ah,09h
int 21h
lea dx,save
mov ah,09h
int 21h
lea dx,clear
mov ah,09h
int 21h
;menu right info
lea di,myedit
call msg
ret
menu endp
;program editarea
;init editarea
editarea proc near
;draw editarea
mov al,0
mov bh,1eh
mov ch,1
mov cl,0
mov dh,30
mov dl,80
mov ah,06h
int 10h
;set cursor
mov bh,0
mov dh,1
mov dl,0
mov ah,02h
int 10h
;get input
l2: mov ah,00h
int 16h
;check the special KEY input
cmp al,0dh
je _enter
;backSpace
cmp al,08h
je _back
cmp ah,48h
je _up
cmp ah,50h
je _down
cmp ah,4bh
je _left
cmp ah,4dh
je _right
cmp al,20h
je _space
jmp getchar
_back:
cmp buflength,0
je l2
;clear area
mov cx,300
mov dl,' '
l5: mov ah,02h
int 21h
loop l5
;set cursor
mov bh,0
mov dh,1
mov dl,0
mov ah,02h
int 10h
;is KEY ENTER ?
cmp BYTE PTR [si],0ah
je lastIsEnter
dec buflength
call show
jmp l2
;DELETE KEY ENTER
lastIsEnter:
dec buflength
cmp buflength,0
jle l2
dec buflength
call show
jmp l2
_down:
_enter:
;get cursor
mov bh,0
mov ah,03h
int 10h
;check is editarea end ?
cmp dh,23
jae l2
; add enter char
mov BYTE PTR [si],0dh
mov BYTE PTR [si+1],0ah
add si,2
add buflength,2
;reset the cursor
mov bh,0
mov ah,03h
int 10h
inc dh
mov dl,0
mov ah,02h
int 10h
jmp l2
_up:
mov bh,0
mov ah,03h
int 10h
cmp dh,0
jbe l2
dec dh
mov cl,0
mov ah,02h
int 10h
jmp l2
_left:
mov bh,0
mov ah,03h
int 10h
mov bh,0
dec dl
mov ah,02h
int 10h
jmp l2
_right:
mov bh,0
mov ah,03h
int 10h
inc dl
mov ah,02h
int 10h
jmp l2
_space:
mov bh,0
mov ah,03h
int 10h
cmp dh,0
jne getchar
cmp dl,4
jbe isopen
cmp dl,7
jb l2
cmp dl,10
jbe issave
cmp dl,12
jbe l2
cmp dl,17
jbe isclear
jmp l2
isclear:
call menu_clear
jmp l2
isopen:
call menu_open
jmp l2
issave:
call menu_save
jmp l2
getchar:
mov BYTE PTR [si],al
inc si
inc buflength
mov bh,0
mov ah,03h
int 10h
cmp dh,0
je l2
mov ah,02h
mov dl,al
int 21h
mov ah,03h
int 10h
push cx
push dx
lea di,myedit
call msg
pop dx
pop cx
mov ah,02h
int 10h
jmp l2
ret
editarea endp
;program menu_open
menu_open proc near
call menu_clear
call openfile
call show
ret
menu_open endp
;program menu_save
menu_save proc near
;new file
lea dx,file
mov cx,0
mov ah,3ch
int 21h
mov fh,ax
;write
mov bx,fh
mov cx,buflength
lea dx,buf
mov ah,40h
int 21h
jnc saveOK
lea di,NO
call msg
ret
saveOK:
lea di,OK
call msg
;colse this file to save the data
mov bx,fh
mov ah,3eh
int 21h
ret
menu_save endp
;program menu_clear
menu_clear proc near
mov bh,0
mov dh,1
mov dl,0
mov ah,02h
int 10h
mov buflength,0
mov cx,1600
lea si,buf
mov dl,' '
l4: mov ah,02h
int 21h
loop l4
mov bh,0
mov dh,1
mov dl,0
mov ah,02h
int 10h
ret
menu_clear endp
;program openfile
openfile proc near
;open file
lea dx,file
mov al,0
mov ah,3dh
int 21h
jc create
mov fh,ax
;read file
lea dx,buf
mov cx,1600
mov bx,fh
mov ah,3fh
int 21h
jnc openOK
lea di,NO
call msg
ret
create:
mov cx,0
lea dx,file
mov ah,3ch
int 21h
ret
openOK:
mov buflength,ax
lea di,OK
call msg
ret
openfile endp
;program printMsg
;param : di (Print message)
msg proc near
;set cursor
mov bh,0
mov dh,0
mov dl,70
mov ah,02h
int 10h
;print msg
mov dx,di
mov ah,09h
int 21h
;cursor recover
mov bh,0
mov dh,1
mov dl,0
mov ah,02
int 10h
ret
msg endp
;program show
show proc near
;clear
mov bh,0
mov dh,1
mov dl,0
mov ah,02h
int 10h
mov cx,buflength
;reset
cmp cx,0
je toclear
;print the char
lea di,buf
l1: mov BYTE PTR dl,[di]
mov ah,02h
int 21h
inc di
loop l1
;set buf tail point SI
mov si,di
ret
toclear:
call menu_clear
ret
show endp
main endp
code ends
end main